2016-06-21 4 views
0

私はfsolveで方程式/未知数の可変数(N)の行列方程式を解いています。 N=2,3の問題の例を示しましたが、各例の最後の行では、それぞれの式をfsolveに 'ハードコード'する必要があります。 Nが変数の場合、これは機能しません。私の質問:fsolveをさまざまな数の方程式で呼び出すにはどうすればいいですか?唯一の問題はfsolveへの呼び出しです。fsolve(Matlab)を使って方程式の可変数系を解く

clear all  
N = 2; 
M(:,:,1) = rand(N); 
M(:,:,2) = rand(N); 
eqn = @(E,n) det(eye(N)-M(:,:,n)*diag(E)); 

%how do I write this line if I don't know what N is?? 
[E_values, Fval, Fflag] = fsolve(@(E) [eqn(E,1);eqn(E,2)],[1,1]) 

それともN=3ため、次のようになります。

clear all 
N = 3; 
M(:,:,1) = rand(N); 
M(:,:,2) = rand(N); 
M(:,:,3) = rand(N); 
eqn = @(E,n) det(eye(N)-M(:,:,n)*diag(E)); 

%how do I write this line if I don't know what N is?? 
[E_values, Fval, Fflag] = fsolve(@(E) [eqn(E,1);eqn(E,2);eqn(E,3)],[1,1,1]) 

(これはしてもしなくてもよいことは大丈夫だ、Mに応じたソリューションを持っている場合があります)。ありがとう。

答えて

1

サイズが入力Nに依存する配列を出力する関数genEqnを作成します。方程式の数と行列Mを、主関数に基づいて新しい関数eqnを定義して渡します。 fsolveへの入力としてeqnを使用してください。以下は5つの方程式の例ですが、任意の数でも同様に動作します。

function varEqFsolve 

N = 5; 
for k = 1:N 
    M(:,:,k) = rand(N); 
end 

guess = ones(1,N); 
eqn = @(E) genEq(E,M,N); 

[E_values, Fval, Fflag] = fsolve(eqn,guess) 

function F = genEq(E,M,N) 

for k = 1:N 
    F(k) = det(eye(N)-M(:,:,k)*diag(E)); 
end 

参照:http://www.mathworks.com/help/optim/ug/passing-extra-parameters.html

1
が適切な関数に匿名関数を回して、ループを使用し

function main 

N = round(rand*8+3); 
for i=1:N 
    M(:,:,i) = rand(N); 
end 

[E_values, Fval, Fflag] = fsolve(@(E) F(E,M),ones(N,1)) 

end 

function y=F(E,M) 

N = size(M,3); 
y = zeros(N,1); 
for i=1:N 
    y(i) = det(eye(N)-M(:,:,i)*diag(E)); 
end 

end 
関連する問題