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