2016-09-12 16 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 может стать 0, как h0 больше, чем допуск. Если это так, критерии не выполняются и цикл продолжается. Следующая итерация h0 является 0 и h будет оцениваться как NaN (с divition с 0 плохо)

Если вы, как и в этом случае ожидать сходимость по отношению к 0, вы могли бы вместо того, чтобы проверить

if h > TOL 

или вы также можете добавить NaN-check

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

Помимо этого, у вас есть несколько проблем с кодом.

Сначала вы инициируете h0, используя i (мнимое число), вы, вероятно, намерены использовать 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,'*-') 

 Смежные вопросы

  • Нет связанных вопросов^_^