本文实例讲述了python计算方程式根的方法。分享给大家供大家参考。具体实现方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
''' roots = polyRoots(a).
Uses Laguerre's method to compute all the roots of
a[0] + a[1]*x + a[2]*x^2 +...+ a[n]*x^n = 0.
The roots are returned in the array 'roots',
'''
from evalPoly import *
from numpy import zeros, complex
from cmath import sqrt
from random import random
def polyRoots(a,tol = 1.0e - 12 ):
def laguerre(a,tol):
x = random()
# Starting value (random number)
n = len (a) - 1
for i in range ( 30 ):
p,dp,ddp = evalPoly(a,x)
if abs (p) < tol: return x
g = dp / p
h = g * g - ddp / p
f = sqrt((n - 1 ) * (n * h - g * g))
if abs (g + f) > abs (g - f): dx = n / (g + f)
else : dx = n / (g - f)
x = x - dx
if abs (dx) < tol: return x
print 'Too many iterations'
def deflPoly(a,root): # Deflates a polynomial
n = len (a) - 1
b = [( 0.0 + 0.0j )] * n
b[n - 1 ] = a[n]
for i in range (n - 2 , - 1 , - 1 ):
b[i] = a[i + 1 ] + root * b[i + 1 ]
return b
n = len (a) - 1
roots = zeros((n),dtype = complex )
for i in range (n):
x = laguerre(a,tol)
if abs (x.imag) < tol: x = x.real
roots[i] = x
a = deflPoly(a,x)
return roots
raw_input ( "\nPress return to exit" )
|
希望本文所述对大家的Python程序设计有所帮助。