【发布时间】:2020-07-13 06:20:41
【问题描述】:
我有 3 个带有三个未知数的大型非线性方程,当我 scipy.optimize.fsolve 得到一个太大的 10^85 附近的答案时。还会引发运行时警告。
import scipy.optimize as opt
def func(variables):
(A, B, C) = variables
x1=4
x2=10
x3=20
x4=5
y1=4
y2=15
y3=10
y4=10
eq1 = ((((x2)/(A*x2+B*y2+C))-((x1)/(A*x1+B*y1+C))) * (((x3)/(A*x3+B*y3+C))-((x2)/(A*x2+B*y2+C))) + (((y2)/(A*x2+B*y2+C))-((y1)/(A*x1+B*y1+C))) * (((y3)/(A*x3+B*y3+C))-((y2)/(A*x2+B*y2+C))) +(((1 )/(A*x2+B*y2+C))-((1 )/(A*x1+B*y1+C))) * (((1 )/(A*x3+B*y3+C))-((1 )/(A*x2+B*y2+C))))
eq2 = ((((x3)/(A*x3+B*y3+C))-((x2)/(A*x2+B*y2+C))) * (((x4)/(A*x4+B*y4+C))-((x3)/(A*x3+B*y3+C))) + (((y3)/(A*x3+B*y3+C))-((y2)/(A*x2+B*y2+C))) * (((y4)/(A*x4+B*y4+C))-((y3)/(A*x3+B*y3+C))) +(((1 )/(A*x3+B*y3+C))-((1 )/(A*x2+B*y2+C))) * (((1 )/(A*x4+B*y4+C))-((1 )/(A*x3+B*y3+C))))
eq3 = ((((x4)/(A*x4+B*y4+C))-((x3)/(A*x3+B*y3+C))) * (((x1)/(A*x1+B*y1+C))-((x4)/(A*x4+B*y4+C))) + (((y4)/(A*x4+B*y4+C))-((y3)/(A*x3+B*y3+C))) * (((y1)/(A*x1+B*y1+C))-((y4)/(A*x4+B*y4+C))) +(((1 )/(A*x4+B*y4+C))-((1 )/(A*x3+B*y3+C))) * (((1 )/(A*x1+B*y1+C))-((1 )/(A*x4+B*y4+C))))
return [eq1, eq2, eq3]
solution = opt.fsolve(func, np.array([1,1,1]))
print(solution)
答案是:
RuntimeWarning:The number of calls to function has reached maxfev = 800.
warnings.warn(msg, RuntimeWarning)
[6.72215161e+84 5.84595081e+84 6.34963908e+85]
我的错误是什么?
【问题讨论】:
-
似乎python版本有所不同。您可以尝试为
factor使用较低的值(例如 10 或 1)吗? -
另外,matlab用的是什么算法?也许它也在 scipy 中实现(docs.scipy.org/doc/scipy-0.14.0/reference/generated/…)
-
@BlackBear 。我试过 0.001,0.01,0.1 答案还是一样。
-
@BlackBear 我检查了链接并使用了不同的算法,并设置了 tol 以防止分歧最终发现三种算法具有相同的结果。谢谢你的好回答。
-
z3是一个 SAT 求解器,哈哈。谷歌一下,你会发现
标签: python equation-solving nonlinear-functions numerical-computing