求方程的在给定初值1.5
附近的一个实根
x 980 − 5.01 x 979 + 7.398 x 978 − 3.388 x 977 − x 3 + 5.01 x 2 − 7.398 x + 3.388 = 0 x^{980} - 5.01x^{979} + 7.398x^{978} - 3.388x^{977} - x^3 + 5.01x^2 - 7.398x + 3.388=0 x980−5.01x979+7.398x978−3.388x977−x3+5.01x2−7.398x+3.388=0
使用
scipy.optimize.fslove
或scipy.optimize.root
,需要给初始值
from scipy.optimize import fsolve, root
fx = lambda x: x**980-5.01*x**979+7.398*x**978\
-3.388*x**977-x**3+5.01*x**2-7.398*x+3.388
x1 = fsolve(fx, 1.5, maxfev=4000) #函数调用4000次
x2 = root(fx, 1.5)
scipy.optimize.fslove
结果:[1.21]
scipy.optimize.root
结果:message: The solution converged.(方案收敛)
success: True
status: 1
fun: [-1.233e+69]
x: [ 1.210e+00]
nfev: 319
fjac: [[-1.000e+00]]
r: [ 2.542e+80]
qtf: [ 2.002e+72]
{ x 1 2 + x 2 2 = 1 x 1 = x 2 \left\{ \begin{matrix} x_1^2+x^2_2=1 \\ x_1=x_2 \end{matrix} \right. {x12+x22=1x1=x2
使用
scipy.optimize.fslove
或scipy.optimize.root
,需要给初始值
from scipy.optimize import fsolve, root
fx = lambda x: [x[0]**2+x[1]**2-1, x[0]-x[1]]
s1 = fsolve(fx, [1, 1])
s2 = root(fx, [1, 1])
print(s1,'\n','--------------'); print(s2)
scipy.optimize.fslove
结果:[0.70710678 0.70710678]
scipy.optimize.root
结果:message: The solution converged.
success: True
status: 1
fun: [ 4.441e-16 0.000e+00]
x: [ 7.071e-01 7.071e-01]
nfev: 9
fjac: [[-8.165e-01 -5.773e-01]
[ 5.773e-01 -8.165e-01]]
r: [-1.732e+00 -5.774e-01 1.633e+00]
qtf: [-3.646e-10 2.578e-10]
{ f 1 ( x ) = 0 f 2 ( x ) = 0 ⋮ f n ( x ) = 0 \left\{ \begin{matrix} f_1(x)=0 \\f_2(x)=0 \\\vdots \\f_n(x)=0 \end{matrix} \right. ⎩ ⎨ ⎧f1(x)=0f2(x)=0⋮fn(x)=0
其中 x x x位 m m m位未知量,若方程数>未知量
则求该式的最小二乘解,即求 ∑ i = 1 n f i 2 ( x ) \sum^{n}_{i=1}f^2_{i}(x) ∑i=1nfi2(x)的最小值
使用
scipy.optimize.least_squares
求非线性方程组的最小二乘解
from scipy.optimize import least_squares
least_squares(funcs,x0)
其中 f u n c s = [ f 1 ( x ) , f 2 ( x ) , ⋯ , f n ( x ) ] T funcs = [f_1(x),f_2(x),\cdots,f_n(x)]^T funcs=[f1(x),f2(x),⋯,fn(x)]T