2017-12-22 142 views
0

ソルバー関数を含むExcelスプレッドシートを変換しようとしていますが、GRG非線形を使用して最小二乗和を返す2つの変数を最適化しています。私は4つの既知の距離(A)で4つの既知の時間(B)を持っています。私は最適化関数を作成して、VmaxとTauの値のどのような相互作用が最小二乗誤差の和を生成するのかを調べる必要があります。私はnls関数とnloptrパッケージを見てきましたが、それらを一緒に作るようには思えません。 VmaxとTauの現在の値は、Excelソルバー関数を介して決定されたものであり、Rで複製するだけです。任意のすべてのヘルプは非常に高く評価されます。ありがとうございました。GRG非線形最小二乗(最適化)

A <- c(0,10, 20, 40) 
B <- c(0,1.51, 2.51, 4.32) 

Measured <- as.data.frame(cbind(A, B)) 

Corrected <- Measured 
Corrected$B <- Corrected$B + .2 
colnames(Corrected) <- c("Distance (yds)", "Time (s)") 
Corrected$`X (m)` <- Corrected$`Distance (yds)`*.9144 

Vmax = 10.460615006988 
Tau = 1.03682513806393 

Predicted_X <- c(Vmax * (Corrected$`Time (s)`[1] - Tau + Tau*exp(-Corrected$`Time (s)`[1]/Tau)), 
Vmax * (Corrected$`Time (s)`[2] - Tau + Tau*exp(-Corrected$`Time (s)`[2]/Tau)), 
Vmax * (Corrected$`Time (s)`[3] - Tau + Tau*exp(-Corrected$`Time (s)`[3]/Tau)), 
Vmax * (Corrected$`Time (s)`[4] - Tau + Tau*exp(-Corrected$`Time (s)`[4]/Tau))) 

Corrected$`Predicted X (m)` <- Predicted_X 
Corrected$`Squared Error` <- (Corrected$`X (m)`-Corrected$`Predicted X (m)`)^2 

#Sum_Squared_Error <- sum(Corrected$`Squared Error`) 

答えて

1

あなたの問題はまだ解決されていませんか? 私も同様の問題に取り組んでいます。

まず変数VmaxとTauの誤差を合計する関数を定義する必要があります。 これらの変数を変更し、最小限の機能を探す最適化アルゴリズムを呼び出すことができます。 OPTIM()は、アプリケーションのために十分であるかもしれないが、ここではnloptrのドキュメントは次のとおりです。

https://www.rdocumentation.org/packages/nloptr/versions/1.0.4/topics/nloptr

、ここでは、Rにおける最適化パッケージのリストです:

https://cran.r-project.org/web/views/Optimization.html

編集:

すぐに私がやる方法を記録しました。私は初心者なので、おそらく最良の方法ではありませんが、それでも動作します。

A <- c(0,10, 20, 40) 
B <- c(0,1.51, 2.51, 4.32) 

Measured <- as.data.frame(cbind(A, B)) 

Corrected <- Measured 
Corrected$B <- Corrected$B + .2 
colnames(Corrected) <- c("Distance (yds)", "Time (s)") 
Corrected$`X (m)` <- Corrected$`Distance (yds)`*.9144 

#initialize values 
Vmax0 = 15 
Tau0 = 5 

x0 = c(Vmax0,Tau0) 

#define function to optimise: optim will minimize the output 
f <- function(x) { 

y=0 
#variables will be optimise to find the minimum value of f 
Vmax = x[1] 
Tau = x[2] 

Predicted_X <- Vmax * (Corrected$`Time (s)` - Tau + Tau*exp(-Corrected$`Time (s)`/Tau)) 

y = sum((Predicted_X - Corrected$`X (m)`)^2) 

return(y) 

} 

#call optim: results will be available in variable Y 
Y<-optim(x0,f) 

あなたがコンソールにYを入力した場合は、ソルバーは、エクセルと同じ値を求め、収束が達成されることがわかります。

Rでは、データフレームに括弧で列を定義する必要はなく、ベクトルを使用する必要はありません。おそらくこの最初のチュートリアルに従ってください。

また、インパルス値をすでに最適な値として設定しているのは間違いです。これを行うと、optim()はさらに最適化されません。ここで

はOPTIMのドキュメントです:

https://stat.ethz.ch/R-manual/R-devel/library/stats/html/optim.html

および機能の使用方法についてのチュートリアル:

https://www.datacamp.com/community/tutorials/functions-in-r-a-tutorial

乾杯

+0

は私の目的のために働く、ありがとうございます。 – 758321

関連する問題