2017-02-21 24 views
2

비선형 다항식 함수를 시도했는데이 코드는 잘 작동합니다. 그러나 이것에 대해서, 선형 방정식 df0 * X = f0를 백 슬래시 또는 bicg 또는 lsqr을 사용하여 풀기 위해 몇 가지 방법을 시도했지만 몇 가지 초기 값을 시도했지만 결과가 수렴하지 않았습니다.변환하지 않음 : Newton Raphson-Method를 사용하여 비선형 방정식의 근원을 찾습니다.

% Define the given function 
syms x1 x2 x3 

x=[x1,x2,x3]; 

f(x)=[3*x1-cos(x2*x3)-1/2;x1^2+81*(x2+0.1)^2-sin(x3)+1.06;... 
    exp(-x1*x2)+20*x3+1/3*(10*pi-3)]; 

% Define the stopping criteria based on Nither or relative errors 

tol=10^-5; 
Niter=100; 

df=jacobian(f,x); 

x0=[0.1;0.1;-0.1]; 

% Setting starting values 

error=1; 
i=0; 

% Start the Newton-Raphson Iteration 

while(abs(error)>tol) 

f0=eval(f(x0(1),x0(2),x0(3))); 

df0=eval(df(x0(1),x0(2),x0(3))); 

xnew=x0-df0\f0; % also tried lsqr(df0,f0),bicg(df0,f0) 

error=norm(xnew-x0); 

x0=xnew; 

i=i+1 

if i>=Niter 

    fprintf('Iteration times spill over Niter\n'); 

    return; 

end 

end 
+0

기능을 플롯하고 시작 추측을 위해 더 나은 선택을보십시오. – duffymo

+0

함수는 3 개의 방정식으로 구성된 벡터입니다. 어떻게 그릴 수 있습니까? – Jarvis

+0

왜 거기서'eval'을 사용하고 있습니까?!? 그것은 완전히 불필요하며 계산 속도를 떨어 뜨릴뿐만 아니라 eval과 그와 관련된 나쁜 습관에 빠지게됩니다. – Adriaan

답변

1

더 잘 수행하려면 여기에 익명 기능이 필요합니다 (오늘 전달하면서 언급 했음).

먼저 함수 정의를 내려 봅시다. 익명 함수는 수학 함수와 비슷한 방식으로 사물을 호출하는 좋은 방법입니다. 예를 들어,

f = @(x) x^2;

은 제곱 함수이다. 그것을 평가하려면, 종이에 쓰는 것과 같이 쓰십시오. f(2). 복수 변수 기능을 가지고 있기 때문에 다음과 같이 정의를 벡터화해야합니다 : 당신의 코비를 들어

f(x) = @(x) [3*x(1) - cos(x(2) * x(3)) - 1/2; ...

, 당신은 (어쩌면 grad_f 전화) 다른 익명 함수를 사용하고 그것을 계산해야합니다 그런 다음 코드를 입력하십시오. jacobian 함수는 유한 차이를 사용하므로 일부 지역에서는 자코비안이 오류로 인해 쌓일 수 있습니다.

핵심은 그냥 조심하고 좋은 코딩 방법을 사용하는 것입니다. 익명 함수 및 기타 좋은 MATLAB 사례에 대한 자세한 내용은 this document을 참조하십시오.

+0

정말 고마워요! – Jarvis

+0

나는 여전히 질문이있다. 계산 된 f (x)의 기울기는 jacobian 함수의 결과와 동일하다. 또한, 나는 루프에서가 아니라 처음 시작에서 jacobian을 사용했습니다. – Jarvis