【问题标题】:Sympy returns a ConditionSet object when solving an equation, while matlab returns a single float when the same equation is solvedSympy 在求解方程时返回一个 ConditionSet 对象,而 matlab 在求解相同方程时返回一个浮点数
【发布时间】:2016-06-15 01:58:41
【问题描述】:

我有 4 个输入变量(浮点数):

最大 最小 百分比 模式 我想为 s 求解以下(相当长的)方程:

> (1/2+1/2*erf((log(Xmax)-(log(mode)+s**2))/(sqrt(2)*s))-(1/2+1/2*erf((log(Xmin)-(log(mode)+s**2))/(sqrt(2)*s))) - percentage == 0

我想用sympy解方程,但它返回一个ConditionSet对象(意思是它不能解方程)

我的代码如下:

from sympy import *

def CalcScaleParam(mode, CIfact, percentage):
    s = Symbol('s', Real=True)
    eqn = (1/2+1/2*erf((log(4)-(log(2)+s**2))/(sqrt(2)*s))-(1/2+1/2*erf((log(1)-(log(2)+s**2))/(sqrt(2)*s)))) - 0.95
    sigma = solveset(eqn, s)
    print(sigma)

CalcScaleParam(2,2, 0.9545)

我的matlab代码如下:

function sigma = Test()

syms s
eqn =(1/2+1/2*erf((log(4)-(log(2)+s^2))/(sqrt(2)*s))-(1/2+1/2*erf((log(1)-(log(2)+s^2))/(sqrt(2)*s)))) - 0.95 == 0;
sigma = solve(eqn,s);

end

并返回 sigma=0.335

我最初认为这是数学问题,但由于方程已在 matlab 中成功求解,我怀疑问题来自 sympy。

【问题讨论】:

  • 根据文档判断,没有将 ReturnConditions 选项设置为 true 的 Matlab solve 只会尝试找到 a 解决方案。 solveset 试图找到所有解决方案。
  • solveset 只会给出象征性的解决方案。如果您想要数值解,请使用数值求解器,例如 sympy.nsolvethese 之一。
  • ReturnConditions 设置为 true 的 matlab 中运行相同的代码确实会返回 Warning: Explicit solution could not be found.,我认为这就是 ConditionSet 在 sympy 中返回的含义。我认为 sympy 文档建议在 sympy 1.0 中使用 solveset 而不是其他求解器。使用 nsolve 给出了这个 error 归结为 mpmath...
  • @asmeurer 有正确答案,分数定义正确,sympy.nsolve(eqn, 0.5) 给出mpf('0.33558869646266484'),就像你的 matlab 解决方案一样。
  • nsolve 的问题是你必须猜测(0.5)。我真的不明白 matlab 怎么能想出一个单一的数值解决方案。

标签: python matlab sympy


【解决方案1】:

分数使用 Python 的整数除法,得到1/2 == 0。整个表达式简化为-0.95。使用1./20.5 或Rational(1,2) 声明它。您可能还必须将百分比 0.95 表示为 Rational(19,20)

【讨论】:

  • 感谢您的帮助,不幸的是,我使用了您提出的所有组合,并且返回了相同的结果。当我在其他方程中使用分数时,Solveset 可以正确求解方程,例如 1/2+s
  • 我不是高级用户,所以很可能这不是问题所在。然而,simplify(eqn) 给出了-0.95solveset(eqn, s) 给出了EmptySet,而它找到了一个符号解,其中分数被正确定义为Rational
  • 仅供参考,当分数被正确定义时,它返回与 Wolfram Alpha 相同的符号解。
  • 我猜您使用的是 Sympy Live Shell,它在启动时执行了 from __future__ import division,或者 Python 3;这就是为什么您不需要明确定义分数的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多