Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当解一个方程时,Sympy返回一个ConditionSet对象,而当解同一个方程时,matlab返回一个浮点_Python_Matlab_Sympy - Fatal编程技术网

Python 当解一个方程时,Sympy返回一个ConditionSet对象,而当解同一个方程时,matlab返回一个浮点

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

我有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 *

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)

根据文档判断,Matlab
solve
在没有
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;这就是为什么不需要明确定义分数的原因。