如何解决SciPy,用“根”法求解方程
如果我尝试用 scipy.optimize.root 方法解决这个方程,没关系,scipy 可以这样做:
(两边都包含 f(x) 或 y)
但是如果我尝试解这个方程,它只会生成“0”根:
(两边都包含“f(x) or I”)
from scipy.optimize import root
import numpy as np
v_arr = np.linspace(0,2,100)
I_L = 0.0006
I_0 = 4.07
KT_q = 0.026
n = 1
Rs = 5
Rsh = 1000
def function(I_out,v_arr):
return ( I_L - I_0*exp((v_arr + I_out*Rs)/KT_q) - (v_arr + I_out*Rs)/Rsh - I_out)
result = root(function,np.zeros(len(v_arr)),v_arr )
print ("output:{}".format(result.x))
并且输出为零:output: [0. 0. 0. 0. 0. 0. .... 0. 0. 0. 0. 0. 0. 0.]
解决方法
我建议您查看 root 以及它返回的 OptimizeResult 对象。
在下面的代码中,优化是分别在v_arr的每个点进行的
并且作为新优化点的初始猜测(x0)(来自 v_arr[index]),我们采用
先前优化点的答案(为 v_arr[index-1] 获得)。此外,如果在算法的任何一点进行优化
不收敛,我们打印一条错误消息并停止进程。
from scipy.optimize import root
import numpy as np
v_arr = np.linspace(0,2,100)
I_L = 0.0006
I_0 = 4.07
KT_q = 0.026
n = 1
Rs = 5
Rsh = 1000
def function(I_out,v_arr):
return ( I_L - I_0*np.exp((v_arr + I_out*Rs)/KT_q) - (v_arr + I_out*Rs)/Rsh - I_out)
result = np.zeros(len(v_arr))
x0 = -0.5
for index,value in enumerate(v_arr):
pointResult = root(function,x0,value)
if pointResult.success == True:
result[index] = x0 = pointResult.x[0]
else:
print("Try to improve your method.\nLast point optimisation result:\n")
print(pointResult)
break
print(result)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。