Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 使用scipy.stats normal cdf时出现Sympy TYPE错误_Python_Scipy_Sympy - Fatal编程技术网

Python 使用scipy.stats normal cdf时出现Sympy TYPE错误

Python 使用scipy.stats normal cdf时出现Sympy TYPE错误,python,scipy,sympy,Python,Scipy,Sympy,当我使用scipy.stats.norm时,为什么Sympy会抛出类型错误?我怎样才能解这个方程 from sympy import Eq, Symbol, solve, Piecewise from scipy.stats import norm import numpy as np x = Symbol('x') eqn = Eq((x-0.2)/0.3, norm.cdf((np.log(100/110) + x**2/2)/x)) print(solve(eqn)) 输出: Typ

当我使用
scipy.stats.norm
时,为什么Sympy会抛出类型错误?我怎样才能解这个方程

from sympy import Eq, Symbol, solve, Piecewise
from scipy.stats import norm
import numpy as np

x = Symbol('x')
eqn = Eq((x-0.2)/0.3, norm.cdf((np.log(100/110) + x**2/2)/x))

print(solve(eqn))
输出:

TypeError: cannot determine truth value of Relational
符号设置 如果您正在寻找符号解决方案,请使用符号函数:例如,SymPy's log而不是NumPy's log。Symphy的统计模块也提供了正常CDF,如
CDF(正常(“x”,0,1))
。正确的Symphy设置如下:

from sympy import Eq, Rational, Symbol, log
from sympy.stats import cdf, Normal
eqn = Eq((x-Rational('0.2'))/Rational('0.3'), cdf(Normal("x", 0, 1))(log(Rational(100, 110)) + x**2/2)/x)
请注意,我将
Rational('0.2')
放在0.2的位置。理性和浮点数之间的区别对于符号数学很重要。从形式上看,这个等式现在看起来不错:

Eq(10*x/3 - 2/3, (erf(sqrt(2)*(x**2/2 - log(11) + log(10))/2)/2 + 1/2)/x)
不幸的是,它看起来也没有希望:对于这样的事情,没有封闭形式的解决方案,包括一个等同于多项式的超越函数。自然,
solve(eqn)
将失败。因此,以上所有内容都证明了symphy的正确用法,但这并没有改变没有符号解决方案的事实

数值解 要以数字方式解决此问题,请执行相反的操作:删除SymPy部件并从SciPy导入
fsolve

from scipy.stats import norm
from scipy.optimize import fsolve
import numpy as np

f = lambda x: (x-0.2)/0.3 - norm.cdf((np.log(100/110) + x**2/2)/x)
print(fsolve(f, 1))   # 1 is a random initial guess
答案是0.33622392。

符号设置 如果您正在寻找符号解决方案,请使用符号函数:例如,SymPy's log而不是NumPy's log。Symphy的统计模块也提供了正常CDF,如
CDF(正常(“x”,0,1))
。正确的Symphy设置如下:

from sympy import Eq, Rational, Symbol, log
from sympy.stats import cdf, Normal
eqn = Eq((x-Rational('0.2'))/Rational('0.3'), cdf(Normal("x", 0, 1))(log(Rational(100, 110)) + x**2/2)/x)
请注意,我将
Rational('0.2')
放在0.2的位置。理性和浮点数之间的区别对于符号数学很重要。从形式上看,这个等式现在看起来不错:

Eq(10*x/3 - 2/3, (erf(sqrt(2)*(x**2/2 - log(11) + log(10))/2)/2 + 1/2)/x)
不幸的是,它看起来也没有希望:对于这样的事情,没有封闭形式的解决方案,包括一个等同于多项式的超越函数。自然,
solve(eqn)
将失败。因此,以上所有内容都证明了symphy的正确用法,但这并没有改变没有符号解决方案的事实

数值解 要以数字方式解决此问题,请执行相反的操作:删除SymPy部件并从SciPy导入
fsolve

from scipy.stats import norm
from scipy.optimize import fsolve
import numpy as np

f = lambda x: (x-0.2)/0.3 - norm.cdf((np.log(100/110) + x**2/2)/x)
print(fsolve(f, 1))   # 1 is a random initial guess

答案是0.33622392。

是什么让你认为可以混合使用sympy表达式和基于scipy的函数?这是有原因的。约翰,你能告诉我们你想计算什么数学表达式吗?@BillBell这个表达式是Eq((x-0.2)/0.3,norm.cdf((np.log(100/110)+x**2/2)/x))@sascha我明白了-谢谢!感谢您的回复,但您已经得到了一个非常好的答案。是什么让您认为您可以混合使用sympy表达式和基于scipy的函数?这是有原因的。约翰,你能告诉我们你想计算什么数学表达式吗?@BillBell这个表达式是Eq((x-0.2)/0.3,norm.cdf((np.log(100/110)+x**2/2)/x))@sascha我明白了-谢谢!感谢您的回复,但您已经得到了一个非常好的答案。