2017-10-26 1 views
0

グラフウィンドウにプロットするxとyのデータがあります。私は、方程式を定義し、その式の最良の値を見つけるためにSciPyのようなものを使用することをユーザーに願っています。例えば式 ユーザ入力=> Y = Iがcurve_fitting又は似たように、この文字列を入れて、欠損値を見つけることができる方法((M^2/C^4)* 2)^ 0.5ユーザー入力文字列を、あるデータに最もよく合うものを見つけるために使用できる方程式に変換する方法

として

お願いします?私は無名の機能を使うことができると思ったが、それは私のために働いていないようだ。

+0

独立変数とは何か、そして上の方程式にはどのようなパラメータが当てはまるのですか? – Goyo

+0

私は、異なる形式で方程式を指定するようにユーザーに頼むことができます。例えば"[m]、[y =((m^2/c^4)* 2)^ 0.5]"である。このようにして、ユーザは私のために独立変数を指定しました –

+0

http://zunzun.com/Equation/2/UserDefinedFunction/UserDefinedFunction/にPythonオープンソースの例があります。ソースコードを参考にして自身の仕事。ソースコードへのリンクは、Webページの一番下にあります。 Python ASTパーサを使用して数学関数のみを使用するため、インターネットから入力された悪意のあるPythonコードは実行されません。 –

答えて

0

lmfit(http://lmfit.github.io/lmfit-py/)がこの目的に役立つ場合があります。カーブフィッティングに対する高度なアプローチの一環として、Python式から取得したユーザー定義モデル関数をサポートするExpressionModelクラスがあります。詳細は http://lmfit.github.io/lmfit-py/builtin_models.html#user-defined-modelsにあります。 (githubのレポの例フォルダから取られた)簡単な例として:

import numpy as np 
import matplotlib.pyplot as plt 
from lmfit.models import ExpressionModel 

x = np.linspace(-10, 10, 201) 

amp, cen, wid = 3.4, 1.8, 0.5 

y = amp * np.exp(-(x-cen)**2/(2*wid**2))/(np.sqrt(2*np.pi)*wid) 
y = y + np.random.normal(size=len(x), scale=0.01) 

gmod = ExpressionModel('amp * exp(-(x-cen)**2 /(2*wid**2))/(sqrt(2*pi)*wid)') 

result = gmod.fit(y, x=x, amp=5, cen=5, wid=1) 

print(result.fit_report()) 
plt.plot(x, y, 'bo') 
plt.plot(x, result.init_fit, 'k--') 
plt.plot(x, result.best_fit, 'r-') 
plt.show() 

[[Model]] 
    Model(_eval) 
[[Fit Statistics]] 
    # function evals = 54 
    # data points  = 201 
    # variables  = 3 
    chi-square   = 0.019 
    reduced chi-square = 0.000 
    Akaike info crit = -1856.580 
    Bayesian info crit = -1846.670 
[[Variables]] 
    amp: 3.40478705 +/- 0.005053 (0.15%) (init= 5) 
    cen: 1.79930413 +/- 0.000858 (0.05%) (init= 5) 
    wid: 0.50051059 +/- 0.000858 (0.17%) (init= 1) 
[[Correlations]] (unreported correlations are < 0.100) 
    C(amp, wid)     = 0.577 

の結果をプリントアウトし、ちょうどであることを enter image description here

のプロットを生成しますclear:astevalモジュール(https://newville.github.io/asteval/)を使用して、平文evalを使用して公開される悪意のあるユーザー入力からできるだけ安全な方法でユーザー入力を解析して評価します。

+0

あなたの例でfit()ルーチンに渡した初期パラメータ値を決めるのにどのような方法を使用しましたか? –

+0

こんにちはJamesさん、この例では、初期値は 'result = gmod.fit(y、x = x、amp = 5、cen = 5、wid = 1)'のように明示的に設定されます。私たちは、すべてのデータセットを魔法のようにフィットさせることを目指していません。次に、多くの組み込みモデル(GaussianModelやLorentzianModelなど)には、ピークライクなデータの合理的な開始値を得るためのヒューリスティックな 'guess'メソッドがあります。 –

+0

私の質問は、サンプルコードが明示的にそれらを設定するかどうかではありません。私の質問は、どのメソッドを使用して、この例で使用されている値を決定したかです。 –

関連する問題