用置换法求解for循环中的单个(非线性)方程



我正试图使用fsolve在for循环中求解单个(非线性(方程,但它似乎在我的代码中不起作用。

来自"如何在python中使用for循环求解非线性方程?"?我成功地将其用于求解两个或多个方程,但无法将其用于单个非线性方程。

*请注意,N是我们在中使用for循环的阶梯范围值

from scipy.optimize import fsolve
import numpy as np
f_curve_coefficients = [-7.14285714e-02, 1.96333333e+01, 6.85130952e+03]
S = [0.2122, 0, 0]
a2 = f_curve_coefficients[0]
a1 = f_curve_coefficients[1]
a0 = f_curve_coefficients[2]
s2 = S[0]
s1 = S[1]
s0 = S[2]

def f(variable):
x = variable
first_eq =a2*x**2+a1*N*x +a0*N**2-(s2*x**2+s1*x+s0)
return [first_eq]
for N in range(1,6,1):

roots = fsolve(f,20) # fsolve(equations, X_0)
print(roots)

在Matlab中,我们有一个名为fzero的函数,它可以解决这个问题——不确定Python是否有类似的函数?

解决方案不必是fsolve,只需根据python论坛用户的建议。。。

提前感谢您的协助。真不知道如果没有斯塔克佛流我会怎么做!

您可以按如下方式更改代码:

from scipy.optimize import fsolve
import numpy as np
f_curve_coefficients = [-7.14285714e-02, 1.96333333e+01, 6.85130952e+03]
S = [0.2122, 0, 0]
a2 = f_curve_coefficients[0]
a1 = f_curve_coefficients[1]
a0 = f_curve_coefficients[2]
s2 = S[0]
s1 = S[1]
s0 = S[2]
f = lambda x : a2*x**2+a1*N*x +a0*N**2-(s2*x**2+s1*x+s0)
for N in range(1,6,1):
roots = fsolve(f, 20)
print(roots)

删除功能:

def f(variable):
x = variable
first_eq =a2*x**2+a1*N*x +a0*N**2-(s2*x**2+s1*x+s0)
return [first_eq]

并将其转换为:

f = lambda x : a2*x**2+a1*N*x +a0*N**2-(s2*x**2+s1*x+s0)

如果你想保留原始代码,只需更正即可:

def f(variable):
x = variable
first_eq =a2*x**2+a1*N*x +a0*N**2-(s2*x**2+s1*x+s0)
return first_eq

您的return [first_eq]返回一个列表并生成异常Result from function call is not a proper array of floats.

您也可以简化代码如下:

def f(x):
return a2*x**2+a1*N*x +a0*N**2-(s2*x**2+s1*x+s0)

查看lambdas参考

fsolve()返回f(x)的根在此处查找

最新更新