我正在使用fsolve来解决非线性方程。我的问题是,根据起点,解决方案会发生变化,我不确定我找到的那些是最合理的。 这是代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve, brentq,newton
A = np.arange(0.05,0.95,0.01)
PHI = np.deg2rad(np.arange(0,90,1))
def f(b):
return np.angle((1+3*a**4-3*a**2)+(a**4-a**6)*(np.exp(2j*b)+2*np.exp(-1j*b))+(a**2-2*a**4+a**6)*(np.exp(-2j*b)+2*np.exp(1j*b)))-Phi
B = np.zeros((len(A),len(PHI)))
for i in range(len(A)):
for j in range(len(PHI)):
a = A[i]
Phi = PHI[j]
b = fsolve(f, 1)
B[i,j]= b
我修复了x0 = 1,因为它似乎给出了更合理的值。但有时,我认为该方法不会收敛,结果值太大。
如何找到最佳解决方案?
非常感谢!
答案 0 :(得分:1)
使非线性求解器松动的永恒问题是对你的函数,初始猜测,求解器本身以及你试图解决的问题有一个非常好的理解。
我注意到有很多(a,Phi)组合,你的功能没有真正的根源。您应该根据您尝试解决的实际问题进行一些数学计算,并确定函数应该具有根的位置。不知道实际问题,我不能为你做那件事。
另外,正如在(自已删除的)答案中所指出的,这在b上是循环的,因此使用有界求解器(例如使用method ='L-BFGS-B'的scipy.optimize.minimize可能有助于保持不变注意,要使用最小化器查找根,可以使用函数的平方。如果找到的最小值不接近于零(根据问题定义),实际最小值可能是复共轭对。
祝你好运。