가장 큰 문제는
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
, h
및 h0
을 모두 사용하지 않아도됩니다. 첫 번째 인덱스에서 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,'*-')
한 버그는 H0은 = (0.5)^i'가 의미하는'사용하고 있다는 점이다'H0 = (0.5)^√-1;'의미'H0 = 9.7656e- 04'. 나는 당신이'h0 = 0.5'을 사용하고 싶다고 생각합니다. 디버깅 도움을 구하는 질문 (* "왜이 코드가 작동하지 않습니까?") *는 원하는 동작을 포함해야합니다. 예상 답변이 무엇인지 저희에게 알려주십시오! –