Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python求解非线性方程:答案与初始猜测相同_Python_Scipy_Sympy_Equation Solving - Fatal编程技术网

用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}))