|
|
| Посл.отвђт | Сообщен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 |