2017-10-26 4 views
0

그래프 창에 플롯하는 x 및 y 데이터가 있습니다. 사용자가 방정식을 정의한 다음 SciPy와 같은 것을 사용하여 방정식의 최적 값을 찾습니다.사용자 입력 문자열을 일부 데이터에 가장 적합한 것을 찾는 데 사용할 수있는 방정식으로 변환하는 방법

예시 수학

에게 사용자 입력 => Y = ((m^2/C^4) * 2)^수 I는 curve_fitting 또는 비슷한이 String 넣고 누락 값을 찾는 방법 0.5

부디? 나는 익명의 기능을 사용할 수 있다고 생각했지만 그것은 나를 위해 일하지 않는 것 같다.

+0

독립 변수가 무엇이고 위 매개 변수에 맞는 매개 변수가 무엇인지 어떻게 알 수 있습니까? – Goyo

+0

다른 형식으로 방정식을 지정하도록 사용자에게 요청할 수 있습니다. 예 : "[m], [y = ((m^2/c^4) * 2)^0.5]". 이런 식으로 사용자가 나를 위해 독립 변수를 지정했습니다 –

+0

http://zunzun.com/Equation/2/UserDefinedFunction/UserDefinedFunction/에서 온라인으로 파이썬 오픈 소스 예제를 구할 수 있습니다. 소스 코드를 소스 코드로 사용할 수도 있습니다. 자신의 일. 소스 코드에 대한 링크는 웹 페이지의 맨 아래에 있습니다. 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의에 REPO의 예제 폴더에서 촬영) 간단한 예를 들어 :

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

안녕하세요 제임스,이 예제에서 초기 값은'result = gmod.fit (y, x = x, amp = 5, cen = 5, wid = 1)'와 같이 사용자가 명시 적으로 설정합니다. 우리는 사용자가 자신의 데이터에 맞도록 돕기 위해 모든 데이터 세트를 마술처럼 맞추려고하지 않습니다. 그리고 다시, 내장 된 많은 모델들 (GaussianModel과 LorentzianModel과 같은)은 최고 수준의 데이터를위한 합리적인 시작 값을 얻기 위해 경험적으로 시도하는'추측 '메소드를 가지고 있습니다. –

+0

제 질문은 예제 코드가 명시 적으로이를 설정하는지 여부는 아닙니다. 내 질문은,이 예제에서 사용 된 값을 결정하기 위해 어떤 방법을 사용 했습니까? –