2016-06-21 278 views
0

我正在求解矩陣方程fsolve方程/未知數(N)。我提供了N=2,3的問題示例,但在每個示例的最後一行中,我必須將每個方程「硬編碼」爲fsolve。如果N是一個變量,這將不起作用。我的問題:如何在可變數量的方程上調用fsolve(在這種情況下,一般爲N)?唯一的問題是調用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

創建一個函數genEqn,該函數輸出一個數組,其大小取決於輸入N.通過定義一個新函數eqn,基於主函數傳遞方程數參數和矩陣M.使用eqn作爲fsolve的輸入。下面是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