2017-04-06 1 views
0

は、私は3つの係数(a、bおよびc)を推定するために、Rで書かれた次のコードを持っている:Pythonで非線形関数をどのようにフィットさせるのですか?

y <- c(120, 125, 158, 300, 350, 390, 2800, 5900, 7790) 
t <- 1:9 
fit <- nls(y ~ a * (((b + c)^2/b) * exp(-(b + c) * t))/(1 + (c/b) * 
     exp(-(b + c) * t))^2, start = list(a = 17933, b = 0.01, c = 0.31)) 

をし、私は、Pythonと同じことをする方法

> summary(fit) 

Formula: y ~ a * (((b + c)^2/b) * exp(-(b + c) * t))/(1 + (c/b) * exp(-(b + 
    c) * t))^2 

Parameters: 
    Estimate Std. Error t value Pr(>|t|)  
a 2.501e+04 2.031e+03 12.312 1.75e-05 *** 
b 1.891e-05 1.383e-05 1.367 0.221  
c 1.254e+00 1.052e-01 11.924 2.11e-05 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 248.8 on 6 degrees of freedom 

Number of iterations to convergence: 33 
Achieved convergence tolerance: 6.836e-06 

この結果を得ますか?

+2

翻訳依頼はオフトピックです。 – Roland

+0

翻訳依頼が話題になっていないため、この質問を話題として閉じようとしています – MLavoie

答えて

3

あなたはあなたに同じ結果を与える、curve_fitを使用することができます。

import scipy.optimize as optimization 
import numpy as np 

y = np.array([120, 125, 158, 300, 350, 390, 2800, 5900, 7790]) 
t = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
start = np.array([17933, 0.01, 0.31]) 

def f(t,a,b,c): 
    num = a*(np.exp(-t*(b+c))*np.power(b+c, 2)/b) 
    denom = np.power(1+(c/b)*np.exp(-t*(b+c)), 2) 
    return num/denom 

print(optimization.curve_fit(f, t, y, start)) 
#(array([ 2.50111448e+04, 1.89129922e-05, 1.25426156e+00]), array([[ 4.12657233e+06, 2.58151776e-02, -2.00881091e+02], 
#  [ 2.58151776e-02, 1.91318685e-10, -1.44733425e-06], 
#  [ -2.00881091e+02, -1.44733425e-06, 1.10654268e-02]])) 
関連する問題