Python 当解一个方程时,Sympy返回一个ConditionSet对象,而当解同一个方程时,matlab返回一个浮点
我有4个输入变量(浮动): 最大值 最小间隙 百分比 模式 我想为s解以下(相当长的)方程:Python 当解一个方程时,Sympy返回一个ConditionSet对象,而当解同一个方程时,matlab返回一个浮点,python,matlab,sympy,Python,Matlab,Sympy,我有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 我想使用Symphy来解方程,但它返回一个条件集对象(意味着它无法解方程) 我的代码如下: from sympy import * d
> (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
我想使用Symphy来解方程,但它返回一个条件集对象(意味着它无法解方程)
我的代码如下:
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)
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
我的Matlab代码如下:
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)
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中成功求解,我怀疑问题来自Symphy。分数使用Python的整数除法,它给出
1/2==0
。整个表达式减少到-0.95
。使用1./2
或0.5
或Rational(1,2)声明它。您可能还必须将百分比0.95表示为Rational(19,20)
根据文档判断,Matlabsolve
在没有ReturnConditions
选项设置为true
的情况下,仅尝试寻找解决方案solveset
尝试查找所有解决方案。solveset
只提供符号解决方案。如果您想要数值解,请使用数值解算器,如sympy.nsolve
或其中一个。在matlab中运行相同的代码并将ReturnConditions
设置为true确实会返回警告:无法找到显式解。
我认为这就是sympy中返回ConditionSet
的意思。我认为Symphy文档建议在Symphy 1.0中使用solveset
,而不是使用其他解算器。使用nsolve给出的结果可以归结为mpmath…@asmuler有正确的答案,分数定义正确,sympy.nsolve(eqn,0.5)
给出了mpf('0.33558869646266484')
,就像你的matlab解决方案一样。nsolve
的问题是你必须给出一个猜测(0.5
)。我真的不明白matlab是如何得出一个单一的数值解的。谢谢你的帮助,不幸的是,我使用了你提出的所有组合,它返回了相同的结果<代码>解算集当我在其他方程中使用分数时,正确地解出方程,比如1/2+sI我不是高级用户,所以很可能这不是问题所在。然而,simplify(eqn)
给出了-0.95
,solveset(eqn,s)
给出了清空集
,而它找到了一个符号解,分数被正确定义为Rational
。仅供参考,它返回与Wolfram Alpha相同的符号解决方案。我猜您使用的是Sympy Live Shell,它在启动时执行了来自uuu future uuu import division的,或Python 3;这就是为什么不需要明确定义分数的原因。