Согласованность дифференциации в Matlab

Я пытаюсь написать программу в Matlab, которая проверяет, насколько последовательным становится определение производной:

(f(x+h)-f(x))/h ~= f'(x)

когда h достаточно мал. Пока у меня есть это:

function [errList] = diffConsistency(f,df,x,iMax,h0)
h=h0;
for i=1:iMax
    leftSide = (f(x+h) - f(x)) / h;
    rightSide = df(x);
    errList = abs(leftSide - rightSide);
    h = h*10^(-1);
end

Затем я использую f=@(x)sin(x) и df=@(x)cosx, я новичок в использовании дескрипторов функций, поэтому это может быть совершенно неправильно. iMax устанавливается на 10 и h0 = 1, x=rand(10)

Может ли кто-нибудь проверить, если это хотя бы отдаленно правильно. Особенно использование функции обрабатывает внутри функции diffConsistency и использование rand.

Должен ли я определять x по-другому, левая сторона правильная? так далее

Любой отзыв поможет. заранее спасибо


person p.late    schedule 01.05.2018    source источник
comment
Как вы тестировали это до сих пор? Работает ли это для sin(x) и cos(x)? Работает ли это для случаев, когда функция не совпадает (попробуйте, скажем, для f = sin (x) и df = sin (x))?   -  person EdR    schedule 01.05.2018
comment
Это не работает, как я надеялся, так как ошибка слишком сильно колеблется и ни к чему не сходится.   -  person p.late    schedule 01.05.2018
comment
Не могли бы вы отредактировать вопрос, чтобы привести пример вывода для различных значений h?   -  person EdR    schedule 01.05.2018


Ответы (1)


Вы используете какие-то специфические данные, которые затемняют результат. Вы вводите случайные числа 10x10 и выводите матрицу ошибок 10x10, но это только для последней i, так как вы перезаписываете errList каждую итерацию!

изменить функцию на:

function [errList] = diffConsistency(f,df,x,iMax,h0)
h=h0;
for i=1:iMax
    leftSide = (f(x+h) - f(x)) / h;
    rightSide = df(x);
    errList(i) = abs(leftSide - rightSide);
    h = h*10^(-1);
end

и если вы называете это как:

err=diffConsistency(@sin,@cos,rand,10,1)

и plot(err), вы можете ясно видеть, как ошибка уменьшается с каждым меньшим h.

person Ander Biguri    schedule 01.05.2018
comment
Сделанный. Однако у меня есть еще один вопрос. Когда я устанавливаю iMax на 100, моя ошибка уменьшается до определенного значения (около 10 ^ -8), но затем снова начинает увеличиваться. Я не знаю, как это объяснить. Ошибка в коде, потеря номера или что-то совсем другое? - person p.late; 01.05.2018
comment
@p.late опасное место, в которое ты попадаешь, осторожно, осторожно! Это связано с компьютерами и арифметикой с плавающей запятой. Нельзя хранить в компьютере сколь угодно малые числа, так как у него ограниченная память. Когда вы достигаете 1e-12, вы начинаете попадать в опасную область, где точность вычислений больше не является надежной. Вы говорите, что пытаетесь вычислить 1e-100 (h). Узнайте больше о том, почему это происходит здесь - person Ander Biguri; 01.05.2018
comment
Ах я вижу. Как вы думаете, какое значение iMax было бы подходящим в этом случае? Кстати, я адаптировал свой код со следующим оператором break: - person p.late; 01.05.2018
comment
если h ‹ 2^(-52) разорвать конец - person p.late; 01.05.2018