2016-08-13 73 views
0

私は、3つのパラメータといくつかのデータを持つ関数を用意しています。これをどうすれば最適に行うことができますか?私は方程式の3つのパラメータの範囲についてもわからない。既知の関数にデータをフィッティングするMATLAB(カーブフィッティングツールボックスなし)

機能は、私が(各セットの50点程度)xyデータポイントの配列を持って自由パラメータalphabetagammaを持っており、

y = (1 - alpha + alpha./sqrt(1 + 2*beta*(gamma*x).^2./alpha)).^(-1) - 1; 

によって与えられ、私は最善を見つけるしたいですalpha,betaおよびgammaを使用してフィット(最小二乗の最小化として定義)

解決方法オンラインでは、私のマシンにはないカーブフィッティングツールボックスが推奨されており、インストールできません。私はベアボーンMATLAB 2015bバージョンしか持っていません。

+0

多くの回答があります。少し具体的になりますか? – Suever

+0

私が適合しようとしている機能の詳細をいくつか追加しました。誰かが答えるのを助けることができるものが他にもあれば教えてください。 – user1936752

+0

どのように最適化を定義/測定しますか?あなたのデータセットの大きさ(xとyの長さ)はどれくらいですか?どのツールボックスが利用できますか? Moore-Penrose pseudoinverse ['pinv'](http://www.mathworks.com/help/matlab/ref/pinv.html)による最小二乗適合は、良い出発点になるかもしれません。 @とユーザーの名前を使用して通知を受け取るようにすると、回答が得られる可能性が高くなります。 – Arpi

答えて

1

円滑なR^n -> R関数の最適化アルゴリズムが必要です。ベアボーンMatlabにしかアクセスできないので、File Exchangeからアルゴリズムを取得することをお勧めします。説明のために私はLMFnlsqを選んだが、これは少し問題があるので十分であるが、ここでは一般的で少し不慣れだと思われる。

LMFnlsqをダウンロードし、Matlabパスに追加してください。


例関数が呼び出さregr_funする便宜上

%--------------------------------------------------------------------- 
% DUMMY DATA 
%--------------------------------------------------------------------- 
% Generate data from known model contaminated with random noise 
rng(333) % for reproducibility 

alpha = 2; 
beta = 0.1; 
gamma = 0.1; 
par  = [alpha, beta, gamma]; 

xx  = 1:50; 
y_true = regr_fun(par, xx); 
yy  = y_true + normrnd(0,1,1,50); 

%--------------------------------------------------------------------- 
% FIT MODEL 
%--------------------------------------------------------------------- 
% intial point of solver 
p0  = [1,1,1]; 

obj_fun = @(p) sum((regr_fun(p, xx) - yy).^2); 

% optimization 
p_fit = LMFnlsq(obj_fun, p0); 

y_fit = regr_fun(p_fit, xx); 

%--------------------------------------------------------------------- 
% PLOT 
%--------------------------------------------------------------------- 
plot(xx, yy, 'o') 
hold on 
plot(xx, y_true) 
plot(xx, y_fit, '--') 

:(regr_funと同じフォルダに)

function y = regr_fun(par, x) 
    alpha = par(1); 
    beta = par(2); 
    gamma = par(3); 
    y = (1 - alpha + alpha./sqrt(1 + 2*beta*(gamma*x).^2./alpha)).^(-1) - 1; 
end 

カーブフィッティング


同様matlab.codetools.requiredFilesAndProductsリストシンボリックツールボックスは、この問題のためにそれを必要とされていないと機能は同様にそのwithouth実行する必要がありますが。

関連する問題