如何在 python 中使用 for 循环求解非线性方程?
How to solve nonlinear equations using a for loop in python?
我正在尝试求解 python 中的非线性方程。我试过使用 Sympy 的求解器,但它似乎在 for 循环语句中不起作用。我正在尝试在 输入 [N].
范围内求解 变量 x
我在下面附上了我的代码
import numpy as np
import matplotlib.pyplot as plt
from sympy import *
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]
answer=[]
x = symbols('x')
for N in range(0,2500,5):
solve([a2*x**2+a1*N*x+a0*N**2-s2*x**2-s1*x-s0-0])
answer.append(x)
print(answer)
可能有比使用 sympy 更有效的方法来解决这个问题 * 我们将不胜感激任何帮助。
请注意,在从 Matlab 转换后,我还是 python 的新手。我可以在 Matlab 中轻松解决这个问题并附上代码,但我在 Python
中与此作斗争
根据this documentation,solve
的输出就是解。没有分配给 x
,那仍然只是符号。
x = symbols('x')
for N in range(0,2500,5):
result = solve(a2*x**2+a1*N*x+a0*N**2-s2*x**2-s1*x-s0-0)
answer.append(result)
回答你的问题“可能有比使用 sympy * 更有效的方法来解决这个问题”
您可以使用 fsolve 求非线性方程的根:
fsolve returns 由 func(x) = 0 定义的 (non-linear) 方程的根,给定初始估计
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html
下面是代码:
from scipy.optimize import fsolve
import numpy as np
def f(variables) :
(x,y) = variables
first_eq = 2*x + y - 1
second_eq = x**2 + y**2 - 1
return [first_eq, second_eq]
roots = fsolve(f, (-1 , -1)) # fsolve(equations, X_0)
print(roots)
# [ 0.8 -0.6]
print(np.isclose(f(roots), [0.0, 0.0])) # func(root) should be almost 0.0.
如果你更喜欢 sympy,你可以使用 nsolve。
>>> nsolve([x+y**2-4, exp(x)+x*y-3], [x, y], [1, 1])
[0.620344523485226]
[1.83838393066159]
第一个参数是方程列表,第二个是变量列表,第三个是初始猜测。
此外,有关详细信息,您可以查看之前在堆栈溢出时提出的有关解决 python 中的 Non-linear 方程的方法的类似问题:
How to solve a pair of nonlinear equations using Python?
我正在尝试求解 python 中的非线性方程。我试过使用 Sympy 的求解器,但它似乎在 for 循环语句中不起作用。我正在尝试在 输入 [N].
范围内求解 变量 x我在下面附上了我的代码
import numpy as np
import matplotlib.pyplot as plt
from sympy import *
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]
answer=[]
x = symbols('x')
for N in range(0,2500,5):
solve([a2*x**2+a1*N*x+a0*N**2-s2*x**2-s1*x-s0-0])
answer.append(x)
print(answer)
可能有比使用 sympy 更有效的方法来解决这个问题 * 我们将不胜感激任何帮助。
请注意,在从 Matlab 转换后,我还是 python 的新手。我可以在 Matlab 中轻松解决这个问题并附上代码,但我在 Python
中与此作斗争根据this documentation,solve
的输出就是解。没有分配给 x
,那仍然只是符号。
x = symbols('x')
for N in range(0,2500,5):
result = solve(a2*x**2+a1*N*x+a0*N**2-s2*x**2-s1*x-s0-0)
answer.append(result)
回答你的问题“可能有比使用 sympy * 更有效的方法来解决这个问题”
您可以使用 fsolve 求非线性方程的根: fsolve returns 由 func(x) = 0 定义的 (non-linear) 方程的根,给定初始估计 https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html
下面是代码:
from scipy.optimize import fsolve
import numpy as np
def f(variables) :
(x,y) = variables
first_eq = 2*x + y - 1
second_eq = x**2 + y**2 - 1
return [first_eq, second_eq]
roots = fsolve(f, (-1 , -1)) # fsolve(equations, X_0)
print(roots)
# [ 0.8 -0.6]
print(np.isclose(f(roots), [0.0, 0.0])) # func(root) should be almost 0.0.
如果你更喜欢 sympy,你可以使用 nsolve。
>>> nsolve([x+y**2-4, exp(x)+x*y-3], [x, y], [1, 1])
[0.620344523485226] [1.83838393066159]
第一个参数是方程列表,第二个是变量列表,第三个是初始猜测。
此外,有关详细信息,您可以查看之前在堆栈溢出时提出的有关解决 python 中的 Non-linear 方程的方法的类似问题: How to solve a pair of nonlinear equations using Python?