【问题标题】:Numerical solution for non-linear equations in PythonPython中非线性方程的数值解
【发布时间】:2019-04-05 00:21:39
【问题描述】:

我有一个集合,其中的数量可能会有所不同,我想使用一些数值方法来解决具有约束的非线性方程。

我已经能够使用 Solver 在 Excel 中解决一个简单的(一个方程式)案例,但之前还没有在 Python 中将类似的东西放在一起,因此希望对方法提出建议。

经过一番挖掘,看起来 fsolve 是解决此类系统的一种流行方法。对于一个简单的两个方程的情况,我的问题采用以下形式,为了清楚起见,分成几部分:

第二个方程 b 的形式相同。

A 是一个常数,变量 Z、S 和 x 是每个实体 i 的常数,唯一独立的值是指数 a 和 b;两个方程,两个未知数,所以应该有一个唯一的解。

正如我所说,我在 Excel 中设置了一个简单的方程案例,并成功地使用 Solver 求解。任何有关在 Python 中进行设置的指导都将受到赞赏。

【问题讨论】:

  • 你应该真正提供你的样本输入,以及你正在使用的常量。您需要为您的问题提供一些背景信息。
  • @LutzL,指定错误,谢谢。
  • 那么w_i的分子只有S_i,因为j是分母的界变量?为什么不能将两者合并成S_i^{a+b}
  • 求根与优化并不完全相同(这是 excel 求解器所做的)。如果要添加约束,则应使用优化;根发现(据我所知,并不明确支持它)。或者,在您的情况下,您可以使用求根并设置 zn = 1 -sum(z1, z2.. z(n-1))。有很多方法(见here)。如果您的函数是标量,您可以使用更简单的算法,例如 brentqfixed_point
  • 好的,现在系统有意义了。但是,我看不到第二个等式,现有的可以压缩为 $$\sum_i(Z_i-A)x_iS_{1i}^aS_{2i}^b=0.$$ 是否正在进行一些最小化,做你寻求 $A$ 的最低价值或类似的东西?

标签: python python-3.x scipy numerical-methods numerical-analysis


【解决方案1】:

您描述的问题是root finding 之一。您想找到 f(a,b)=0 的 (a,b)

一个简单的方法是定点迭代。由于您有 f(a,b) 的解析表达式,因此您可以计算导数并使用牛顿法。要使用 fsolve 进行设置,您需要定义一个函数:

def myfunc(x):
    val1 = #evaluate your first expression here using Z and S
    val2 = #evaluate your second expression here
    return np.ndarray([val1 val2])

您可以选择使用 *args 参数传入 S 和 Z 的值。

然后使用:

fsolve(myfunc,x0)

其中 x0 是初始猜测。

请注意,fsolve 可能不尊重您在 w 上的条件。如果您的问题不能同样满足,我会研究一种支持约束优化的方法,例如fmin_slsqp。无论哪种情况,语法都应该与我为 fsolve 描述的非常相似。

【讨论】:

  • 对,我修改了我的原始方程以适应 fsolve。非常感谢有关如何在 Python 中进行设置的建议。
  • yes 和 no...yes 对于单个方程的情况。我试图解决一个由 n 个方程组成的系统的问题。我不清楚如何使用您上面概述的内容来求解一个由五个方程组成的系统的 a、b、c、d、e。
  • @Chris 我概述的示例是针对具有 2 个未知数的 2 个方程。如果您需要做的不止这些,只需将 val3、val4 等添加到 myfunc 并传入更长的 x0。请注意, myfunc 将元组作为参数并返回相同长度的元组。在这种情况下,为 2,但很容易为 5。
  • 为了澄清它在技术上是一维 numpy 数组而不是元组,但无论如何它都是一维数据结构。
【解决方案2】:

能够在上面的帮助下整理出一个解决方案,不胜感激。我接受了约翰的回答;下面的解决方案代码供参考。

import pandas as pd
import numpy as np
from scipy.optimize import fsolve

Aq = .6
Av = .6

def eqs(p):
    a, b = p    
    return(np.dot(x*(qS**a*vS**b)/np.dot(x,qS**a*vS**b),qZ)-Aq 
            , np.dot(x*(qS**a*vS**b)/np.dot(x,qS**a*vS**b),vZ)-Av)

sol = fsolve(eqs, (1,1), full_output=True)
x, y = sol[0]

【讨论】:

  • 如果解决方案代码确实有效,那将会很有帮助!但是感谢您提供它。
【解决方案3】:

以下是如何为非线性方程设置 Python 解决方案的示例:

import numpy as np
from scipy.optimize import fsolve
from math import cos

# non-linear equations:
#  x0 cos(x1) = 4.
#  x0x1-x1 = 5.
def func2(x):
    out = [x[0]*cos(x[1]) - 4]
    out.append(x[1]*x[0] - x[1] - 5)
    return out


x02 = fsolve(func2, [1, 1])
print("x02: "+str(x02))

打印: x02: [6.50409711 0.90841421]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多