2016-06-27 2 views
2

私は、X(XminXmax)の最大値と最小値、および信頼度(percentage)を持っています。なぜmatlabのsolve()関数はこの式を解くことができますが、sympyのnsolve()関数は推測が必要ですか?

累積分布関数:

CDF

とモード

は、私は理論的な対数正規分布のμとσを見つけるために以下の機能を使用したいです

mode

私は次のMatlabスクリプトから始めました。

function [mu, sigma] = DefLog(Mode, Percentage, Xmin, Xmax) 

syms s 
eqn = 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; 
sigma = solve(eqn,s) 

mu=log(Mode)+sigma^2 

end 

これは私にmuとsigmaの数値解を与えます。例えば

私はDefLog(2, 0.95, 1, 4)を実行する場合、私は、私は、Pythonにこの式を変換するために必要なので、私は同じ方程式を解くためにsympyを使用sigma = 0.33mu = 0.80

得ます。私がsympyで単一の数値解を得る唯一の方法は、nsolve関数を使うことでした。次のように私のコードは次のとおりです。

from sympy import * 

def CalcScaleParamOPT(mode, percentage, Xmin, Xmax): 

    s = Symbol('s', Real=True) 

    eqn = (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)))) - 0.95 

    sigma = nsolve(eqn, 0.6) 

    mu=log(mode)+sigma**2 

    print(sigma) 
    print(mu.evalf()) 


CalcScaleParamOPT(2, 0.95, 1, 4) 

これはMatlabのスクリプトと同じソリューションを提供しますが、MATLAB solve()機能nsolve()とは違って、私が探しています答えに十分に近い「推測」が必要です。 MATLABはどのように推測されずに単一のソリューションを見つけることができますか?

+0

これらは全く異なる2つの機能です。 Matlabの 'solve'はシンボリックソルバーです(Sympyの' solve'に似ています)。 Sympyの 'nsolve'は数値ソルバーです(Matlabの' vpasolve'や 'fsolve'と似ています)。 – horchler

+0

'solve()'はsympy 1.0で 'solvestet()'に置き換えられますが、 'solveset'を使ってこれを解決しても結果は返されません。私はこの違いについて質問したときに得た勧告に従ってnsolveを使用しています。リンク[ここ](http://stackoverflow.com/questions/37818218/sympy-returns-a-conditionset-object-when-solving-an-equation -while-matlab-retur) – cachemoi

+0

推測は、私にとって非線形で反復的な数値解を意味します。 – duffymo

答えて

1

documentationに基づいて、MATLABのsolveは自動的に数値解に戻ります。仮に推測値を自動的に生成するとしますが、solveは1つの数値解(見つかった最初の解)のみを返すため、vpasolveを使用して推測間隔を手動で渡すことができます。

+0

残念ながら、ありがとうございます。推測値を自動的に生成するsympy関数を知っていますか?私はドキュメントで1つを見つけることができません。推測値があまりにも遠い場合、 'nsolve()'は失敗します。 – cachemoi

+0

'nsolve'のように見えるので、推測のために間隔をあけて渡すこともできます。 'nsolve'は単に' mpmath.findroot'のラッパーですので、その詳細については[its docs](http://mpmath.org/doc/current/calculus/optimization.html#mpmath.findroot)を参照してください。それができること。 – asmeurer

関連する問題