2016-09-12 2 views
-2

는 계산과의 수렴 속도를 결정하기 위해 MATLAB 코드를 쓰기 수렴 속도 결정 :컴퓨팅 및

(exp(h)-(1+h+1/2*h^2))/h ‍‍‍‍‍‍ ‍‍‍‍‍‍ with h=1/2, 1/2^2,..., 1/2^10

내 코드를했다 :

h0=(0.5)^i; 
TOL=10^(-8); 
N=10; 
i=1; 
flag=0; 
table=zeros(30,1); 
table(1)=h0 

while i < N 
    h=(exp(h0)-(1+h0+0.5*h0^2))/h0; 
    table (i+1)=h; 
    if abs(h-h0)< TOL 
     flag=1; 
     break; 
    end 
    i=i+1; 
    h0=h; 
end 

if flag==1 
    h 
else 
    error('failed'); 
end 

받은 답변 전혀 의미가 없습니다. 도와주세요.

+0

한 버그는 H0은 = (0.5)^i'가 의미하는'사용하고 있다는 점이다'H0 = (0.5)^√-1;'의미'H0 = 9.7656e- 04'. 나는 당신이'h0 = 0.5'을 사용하고 싶다고 생각합니다. 디버깅 도움을 구하는 질문 (* "왜이 코드가 작동하지 않습니까?") *는 원하는 동작을 포함해야합니다. 예상 답변이 무엇인지 저희에게 알려주십시오! –

답변

0

가장 큰 문제는

if abs(h-h0) < TOL 

표현식은 충분히 빨리 한계에 접근 할 경우 내성 검사에, h는 허용 오차보다 더 큰 공 h0로 될 수 있습니다. 그렇다면 기준이 충족되지 않고 루프가 계속됩니다. 다음 반복 h0은 0이며,이 경우처럼 당신이, 0을 향해 수렴을 기대한다면

(0 divition 나쁜 때문에) NaN, 대신

if h > TOL 

를 확인하거나 수 있기 h 평가됩니다 당신은 또한 NaN 검사를 추가 할 수 있습니다.

if abs(h-h0) < TOL || isnan(h) 

이외에도 코드에 몇 가지 문제가 있습니다.

처음으로 i (허수)을 사용하여 h0을 시작하면 i = 1을 사용하려고 의도 했겠지만 그 행은 코드에서 아래에 있습니다.

당신은 while 루프를 사용하지만 귀하의 경우에는 i를 증가 시키려고 할 때 for 루프도 좋을 것입니다.

변수 table, hh0을 모두 사용하지 않아도됩니다. 첫 번째 인덱스에서 h0으로 초기화 된 단일 결과 벡터를 만듭니다 (아래 예제 참조). 난 당신의 코드에서 볼

TOL = 1e-8; % Tolerance 
N = 10; % Max number of iterations 

% Value vector 
h = zeros(N+1,1); 

% Init value 
h(1) = (0.5)^1; 

for k = 1:N 
    h(k+1) = (exp(h(k)) - (1 + h(k) + 0.5*h(k)^2))/h(k); 
    if isnan(h(k+1)) || abs(diff(h(k + [0 1]))) < TOL 
     N = k; 
     break 
    end 
end 
% Crop vector 
h = h(1:N); 

% Display result 
fprintf('Converged after %d iterations\n', N) 

% Plot (with logarithmic y-xis) 
semilogy(1:N, h,'*-')