【发布时间】: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的 Matlabsolve只会尝试找到 a 解决方案。solveset试图找到所有解决方案。 -
solveset只会给出象征性的解决方案。如果您想要数值解,请使用数值求解器,例如sympy.nsolve或 these 之一。 -
在
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 怎么能想出一个单一的数值解决方案。