用python求解非线性方程:答案与初始猜测相同
所以我有一个复杂的方程需要解。我认为最后的用python求解非线性方程:答案与初始猜测相同,python,scipy,sympy,equation-solving,Python,Scipy,Sympy,Equation Solving,所以我有一个复杂的方程需要解。我认为最后的x的顺序应该是1E22。但这段代码的问题是它使我的整个系统崩溃。有办法吗?我尝试了scipy.optimize.root,但它在这个数量级上并没有真正解决任何问题(它给出了最终答案,作为初始猜测,没有任何迭代) 这两个scipy函数都不起作用。sympy功能使我的笔记本电脑崩溃。Matlab是这方面的理想选择吗?使用SciPy的数值解 SciPy对这个方程的问题是。你将N提升到极小的幂次,使它非常接近1;在浮点算术中,它正好变成1。类似地,来自指数的部分
x
的顺序应该是1E22。但这段代码的问题是它使我的整个系统崩溃。有办法吗?我尝试了scipy.optimize.root
,但它在这个数量级上并没有真正解决任何问题(它给出了最终答案,作为初始猜测,没有任何迭代)
这两个scipy函数都不起作用。sympy功能使我的笔记本电脑崩溃。Matlab是这方面的理想选择吗?使用SciPy的数值解
SciPy对这个方程的问题是。你将N提升到极小的幂次,使它非常接近1;在浮点算术中,它正好变成1。类似地,来自指数的部分变为1。然后两部分相减,剩下的0-方程似乎已经解出来了。您可以通过打印func(1E21)
看到这种情况——它返回0
处理失去意义的方法是从原始形式重写方程式
exp(x/((2*cs/(esi*q))**2)) == (x/ni)**(esi*k*T)
通过将两侧提升到电源1/(esi*k*T)
:
因此func
成为
def func(N):
return np.exp(N*esi*q**2/(k*T*(2*cs)**2)) - (N/ni)
(建议将NumPy函数与SciPy解算器一起使用。)也就是说,解算器(例如root(func,1E10)
)将报告无法收敛到解决方案
带辛的符号解
SymPy用于解析解方程。它不关心一堆浮点数。给它一个符号等式:
x, a, b, c = symbols('x, a, b, c', positive=True)
sol = solve(exp(x/a) - (x/b)**c, x)[0]
得到的解为-c*LambertW(-a/(b*c))/a
。然后可以对其进行评估:
cs = 507.643E-12
esi = 1.05E-10
q = 1.6E-19
T = 300
k = 1.381E-23
ni = 1.45E16
print(sol.evalf(subs={a: (2*cs/(esi*q))**2, b: ni, c: esi*k*T}))
它打印了
-21301663061.0653-4649834682.69762*I
,证实了人们已经从SciPy收敛失败中预期的结果:方程没有真正的解 这里的问题是打印(解决(exp(x/((2*cs/(esi*q))**2))-((x/ni)**(esi*k*T)),x))。这不是获得结果的最佳方式。它基本上会消耗大量内存,使你的笔记本电脑崩溃。尝试使用不同的技巧来解方程,而不是使用sympy solve。
x, a, b, c = symbols('x, a, b, c', positive=True)
sol = solve(exp(x/a) - (x/b)**c, x)[0]
cs = 507.643E-12
esi = 1.05E-10
q = 1.6E-19
T = 300
k = 1.381E-23
ni = 1.45E16
print(sol.evalf(subs={a: (2*cs/(esi*q))**2, b: ni, c: esi*k*T}))