【问题标题】:Equation solving in PythonPython中的方程求解
【发布时间】:2013-02-05 03:45:39
【问题描述】:

我正在尝试为 x 求解如下等式:

这里给出了 alpha 和 K,N 将超过 1,000。有没有办法使用 sympy 为 alpha 指定一个 np.array 的 LHS?我的希望是定义:

eqn = Eq(LHR - K)
solve(eqn,x)

通过告诉 sympy LHS= sum(a_i + x)。

任何最快的求解器提示也将不胜感激。谢谢!

我希望得到类似的东西:

from sympy import Symbol, symbols, solve, summation, log
import numpy as np
N=10
K=1
alpha=np.random.randn(N, 1)
x = Symbol('x')
i = Symbol('i')
eqn = summation(log(x+alpha[i]), (i, 1, N))
solve(eqn-K,x)

【问题讨论】:

  • 如果你对两边取幂并简化左边,你最终会得到 prod(a_i + x) = exp(K),一个 N 次多项式。你期望得到什么样的答案?
  • @WarrenWeckesser - 它们被写为以 10 为基础的日志。你会有PROD(a_i + x) = 10 ** K
  • log 通常表示日志基数。

标签: python sympy


【解决方案1】:

您不能使用 SymPy 符号索引 NumPy 数组。由于您的总和是有限的,只需使用 Python 的 sum 函数:

>>> alpha=np.random.randn(1, N)
>>> sum([log(x + i) for i in alpha[0]])
log(x - 1.85289943713841) + log(x - 1.40121781484552) + log(x - 1.21850393539695) + log(x - 0.605693136420962) + log(x - 0.575839713282035) + log(x - 0.105389419698408) + log(x + 0.415055726774043) + log(x + 0.71601559149345) + log(x + 0.866995633213984) + log(x + 1.12521825562504)

但即便如此,我还是不明白您为什么不按照 Warren Weckesser 的建议将其重写为 (x - alpha[0])*(x - alpha[1])*...*(x - alpha[N - 1]) - exp(K)。然后,您可以使用像 SymPy 的 nsolve 这样的数值求解器或其他库中的东西来数值求解此问题

>>> nsolve(Mul(*[(x - i) for i in alpha[0]]) - exp(K), 1)
mpf('1.2696755961730152')

您也可以用数字求解 log 表达式,但除非您的 log 可以有负参数,否则它们应该是相同的。

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 2017-03-22
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多