使用fsolve求解变量数方程组(Matlab)

时间:2016-06-21 17:19:51

标签: matlab function matrix linear-algebra

我用fsolve求解可变数目的方程/未知数(N)的矩阵方程。我已经为N=2,3提供了一个问题示例,但在每个示例的最后一行中,我必须使用“硬编码”。每个方程进入fsolve。如果N是变量,则无效。我的问题:如何在可变数量的方程式上调用fsolve(在本例中为一般N)?唯一的问题是调用fsolve。

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,没关系)。感谢。

2 个答案:

答案 0 :(得分: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 :(得分: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