2016-06-30 11 views
0

私はだから私は、次のMATLABコード(nlp.m)書くMatlab:関数定義でワークスペース変数にアクセスできますか?

\sum_{k=1}^{n} |a_1 x_k + b_1 - y_k|

を最小限定数A1、B1を見つけたい:

function NLP 
x0 = ones(2, 1); 
[a1b1, sum1] = fmincon(@objfun, x0, [], [], [], [], [], [], []) 

function sum1 = objfun(a1b1) 
sum1 = sum(abs(a1b1(1) * x + a1b1(2) - y)); 

ワークスペース

で作成 xyのn-ベクトルとを

しかし、nlp.mを実行すると、次のエラーが表示されます。

>> nlp 
Undefined function or variable 'x'. 
... 

私はworkspaceで定義された変数にアクセスできないようです。では、どうすれば を処理できますか?

+1

最良の方法は、引数として 'X'を取るobjfun' '' objfun'に 'X'を通過し、そうさせることです。 – edwinksl

+0

'fmincon'とすべての種類の反復メソッドを必要とせずに、最小二乗適合を使用するだけではどうですか?私は彼らにとって同じ結果を期待していますか?私。 | r | | r |^2と同じ最小値を持ち、したがってr^2、rは残差である。 – Bernhard

+0

@edwinkslちょっとした例であなたのコメントを答えにしてみませんか? – Bernhard

答えて

0

基本ワークスペース内の変数にはスクリプトから直接アクセスできますが、関数ではアクセスできません。 これらの変数を目的関数に渡すには、http://www.mathworks.com/help/optim/ug/passing-extra-parameters.htmlを参照してください。

function sum1 = objfun(a1b1, x, y) 
sum1 = sum(abs(a1b1(1) * x + a1b1(2) - y)); 

は、他の代替がベースを保存するために、次のようになります。

% NLP - script 
x0 = ones(2, 1); 
f = @(a1b1)objfun(a1b1,x,y); 
[a1b1, sum1] = fmincon(@f, x0) 

を、別の機能であなたの目的関数を定義します。

だから、このようなスクリプトを使用して、あなたの機能を変更することができますワークスペースをファイルに追加し、このファイルをメイン関数にロードします。この場合、 あなたは、このようなあなたの機能を更新することができます:

function nlp 
% save workspace variable to file 
evalin('base','save(''ws.mat'',''x'',''y'');') 
x0 = ones(2, 1); 
s=load('ws.mat'); 
x=s.x;y=s.y; 
f = @(a1b1)objfun(a1b1, x, y); 
[a1b1, sum1] = fmincon(@f, x0); 

function sum1 = objfun(a1b1, x, y) 
sum1 = sum(abs(a1b1(1) * x + a1b1(2) - y)); 
関連する問題