python - 如何在python中使用for循环求解非线性方程?
问题描述
我正在尝试在 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 中解决这个问题
解决方案
回答您的问题“解决此问题的方法可能比使用 sympy * 更有效”
您可以使用 fsolve 找到非线性方程的根: fsolve 返回由 func(x) = 0 定义的(非线性)方程的根,给出初始估计 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 中求解非线性方程的方法的类似问题: 如何使用 Python 求解一对非线性方程?
推荐阅读
- python - 为什么 Pip 不能在 Python 3.6.9 虚拟环境中工作?
- oracle - #APP_IMAGES# not woking in Javascript function in Oracle APEX 18.2
- c - 如何用加号和减号将整数转换为字符串
- c# - 如何从实体框架核心调用存储过程中检索值调用第一个或默认方法
- datastage - 如何盲目地将字段转换为空格
- c# - 自定义字段选项是领域驱动设计中的值对象还是实体
- python - python脚本是否可以在写入该行之前检查谷歌表格中是否存在该行?
- c++ - 创建向量时如何修复“调用没有匹配的函数”错误
- c - fscanf 及其扫描的数据类型
- python - 在熊猫数据框中完成工作日的日子?