2016-06-21 494 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