· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Численное дифференцирование

Посл.отвђт Сообщенiе


Дата: Июн 19, 2004 03:32:43

Как делается численное дифференцирование начиная с третьего порядка и вперед? Если делать напрямую, по определению производной, даже через центральную разность, то даже 128-ми бит начиная где-то с третьего порядка может не хватить. Мантисса загрустит :(
Для каждого следующего порядка придется приближать epsilon к нулю. Поэтому на третьем-четвертом порядке мантиссы уже не хватит. Есть ли способ численного дифференцирования, свободный от этого?


Дата: Июн 19, 2004 05:22:44

У меня нет, к сожалению, достаточной мат. подготовки, чтобы достойно ответить :(
Однако, если, скажем, тебя интересует вычисление с бесконечной точностью, то алгоритма в Кнуте давно реализованы в Mircal/GMP/LiDIA и других пакетах.


Дата: Июн 19, 2004 15:04:31

На счет тов. Кнута все понятно. Меня интересует програмная реализация. Т.е. чтобы на FPU это дело можно было бы посчитать без всяких приколов типа дополнительные регистры и т.д.

Что я имею ввиду.

f'(x0)=lim (f(x0+dx) - f(x0-dx))/(2dx)

Это центральная разность. dx стремится к нулю справа. Так вот, операции, чувствительные к размеру мантиссы это
fadd
fiadd
fsub
fisub
Чувствительные, всмысле погрешность будет зависеть от разности порядков операндов. Вообще, правильный подбор epsilon из соображений ограничения на мантиссу - это целая наука. Далее:

f''(x0) = lim (f'(x0+dt) - f'(x0-dt))/(2dt)

В этом случае dt должно быть (теоретически) o(dx) (всмысле предельного поведения). Но мантисса-то у нас ограничена! Поэтому по этой формуле 5-ю производную посчитать просто не реально.

Так вот, существует ли какой-то другой, математический, а не алгоритмический способ вычисления n-ой производной? Скажем, через ряды? Или может быть через реккурентные соотношения?


Дата: Июн 20, 2004 02:30:47 · Поправил: aSL


Так вот, существует ли какой-то другой, математический, а не алгоритмический способ вычисления n-ой производной? Скажем, через ряды? Или может быть через реккурентные соотношения?


Хмм... А конечные/разделенные разности кто-то уже отменил?

Имхо, приближаем функцию вблизи точки (по таблице) интерполяционным полиномом (можно по узлам Чебышева, чтобы погрешность была поменьше), а как численно продифференцировать полином ясно ;)

Явные формулы через конечные разности получаются влет. Вот только для 5й производной с хорошей погрешностью, например, надо где-то 10-15 точек, в которых подсчитана производная с хорошей точностью.

И оценки погрешности (снизу!) для производных получаются весьма неутешительные, грубо говоря, по порядку получаются = порядку погрешности исходных точек+порядок производной. То есть, если у нас функция вычислена с 5 знаками после запятой, то рассчитывать хотя бы на первый точный знак после запятой у пятой производной - весьма смелый поступок ;)

Вопросы же сходимости этого процесса при стремлении точек апроксимации к исходной точке - весьма сложны. Тут есть некоторые оценки по выбору шага, так, чтобы погрешности были минимальны... но все-таки...

PS: Рекомендую: И.П Мысовских "Методы вычисления".


Дата: Июн 22, 2004 01:50:45

imho лучше обойтись без численного дифференцирования.
определить производную в символьном виде и вычислять ее значение.


Дата: Июн 26, 2004 02:32:29 · Поправил: _DEN_

aSL
Вот и я о том же... Чем выше порядок, тем больше погрешность. Чебышев это или через предел... Так что не светит мне разложить exp(x) в Тейлора до 100-го члена :-)

nvdk
Ага, может тогда сразу MatCAD напишем? :)


Дата: Июн 26, 2004 03:37:34

_DEN_
Так что не светит мне разложить exp(x) в Тейлора до 100-го члена

А зачем так много? Для вычисления exp(x) поступают следующим образом: возводят e в степень int(x), а затем, разложив в ряд, вычисляют e^(x-int(x)) и перемножают. Причем просуммировать достаточно всего с десяток членов чтобы получить хорошую точность.


Дата: Июн 26, 2004 04:26:44

Black_mirror
Это как бы шутка была....


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050