2016-06-21 2 views
0

다양한 방정식/미지수 (N)에 대해 fsolve를 사용하여 행렬 방정식을 풀고 있습니다. N=2,3에 대한 문제의 예제를 제공했지만 각 예제의 마지막 줄에서 각 방정식을 fsolve에 '하드 코드'해야합니다. N이 변수 인 경우에는 작동하지 않습니다. 내 질문 : 방정식의 변수 번호 (이 경우 일반 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

배열을 출력하는 입력을 출력하는 genEqn 함수를 만듭니다.이 함수의 크기는 입력 N에 따라 달라집니다. 기본 함수를 기반으로 새로운 함수 인 eqn을 정의하여 방정식 매개 변수와 행렬 M의 매개 변수를 전달하십시오. 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