【问题标题】:How to solve nonlinear equations using a for loop in python?如何在python中使用for循环求解非线性方程?
【发布时间】:2021-01-13 17:31:07
【问题描述】:

我正在尝试在 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 中解决这个问题

【问题讨论】:

  • for 循环给您带来的麻烦是什么?在我看来没问题。第一次迭代,N==0,是最有趣的,因为有一些术语丢失了。它解决了第一次迭代吗?
  • 我知道您的问题可能是什么。您是否希望通过三个方程来求解?我想知道你在那里的空间。你真的想在那个空格前面加一个逗号,这样你就有了三个方程,而不是只有两个。我看到三个未知数,所以这可能是你的问题。
  • 您好史蒂夫感谢您的反馈。当我运行代码时,我得到的只是数组中的 x,而不是值。应该只有两个方程。我用逗号分隔两个方程。我也会尝试通过删除空格来运行代码。让我看看会发生什么。
  • 我修改了代码 - 所以它必须解决一个方程。但还是没有解决。一直给我 x 作为答案

标签: python sympy nonlinear-optimization equation-solving nonlinear-functions


【解决方案1】:

回答您的问题“解决此问题的方法可能比使用 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 中求解非线性方程的方法的类似问题: How to solve a pair of nonlinear equations using Python?

【讨论】:

  • 感谢您回答使用更有效的方程求解器的部分。我设法将您的代码与 for 循环一起使用,并且工作得同样好。我确实看到 fsolve 工作得更快。特别是在我的情况下处理 for 循环中的大范围时。
【解决方案2】:

根据this documentationsolve的输出就是解。 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多