微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SciPy,用“根”法求解方程

如何解决SciPy,用“根”法求解方程

如果我尝试用 scipy.optimize.root 方法解决这个方程,没关系,scipy 可以这样做:

(两边都包含 f(x) 或 y)

enter image description here

但是如果我尝试解这个方程,它只会生成“0”根:

(两边都包含“f(x) or I”)

enter image description here

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 举报,一经查实,本站将立刻删除。