вычислить производную в javascript

Чтобы вычислить значение производной данной функции Func в данной точке x, чтобы получить хорошую точность, можно подумать так:

a = Fun( x - Number.MIN_VALUE)
b = Func( x + Number.MIN_VALUE)
return (b-a)/(2*Number.MIN_VALUE)

Теперь для любого x + Number.MIN_VALUE (или x - Number.MIN_VALUE) оба возвращают x в javascript.

Я пробовал разные значения, и 1 + 1e-15 возвращает 1.0000000000000001. Пытаясь получить большую точность, 1 + 1e-16 возвращает 1. Поэтому мне придется использовать 1e-15 вместо Number.MIN_VALUE, который равен 5e-324.

Есть ли способ получить лучшую точность в этом случае в javascript?


person Swair    schedule 12.12.2012    source источник
comment
1 - 1e-15 возвращает: 0.999999999999999; 1 - 1e-16 возвращает: 0.9999999999999999; Я не вижу здесь проблемы.   -  person Cerbrus    schedule 12.12.2012
comment
ой.. отредактировал. 1 + 1e-15 и 1 + 1e-16.   -  person Swair    schedule 12.12.2012
comment
Существует только определенный диапазон точности, с которым вы можете работать, это связано со способом с плавающей запятой числа работают. Вот почему вы не можете по-настоящему рассчитать с 1.0 и 1e-17 или меньше, в то время как система может представить эти меньшие числа.   -  person Cerbrus    schedule 12.12.2012
comment
У меня были что каждый ученый должен знать о арифметики с плавающей точкой некоторое время в моем списке для чтения. Я думаю, это время.   -  person Swair    schedule 12.12.2012


Ответы (1)


На самом деле это совсем не про javascript.

Уменьшение расстояния между точками не повысит точность производной. Значения функции в ближайших точках будут вычисляться с некоторой ошибкой в ​​последних цифрах, и, наконец, ваша ошибка будет намного больше, чем расстояние между точками. Затем вы делите очень маленькую разницу, которая имеет огромную относительную погрешность, на очень маленькое число, и вы, скорее всего, получите полную чушь.

Лучший способ получить более точное значение производной — вычислить функцию в нескольких точках (с не очень малым разделением), а затем построить полином аппроксимации и продифференцировать его в интересующей вас точке.

person begemotv2718    schedule 12.12.2012
comment
ОК, это звучит хорошо. Можете ли вы указать мне какую-нибудь библиотеку, которая делает это (желательно библиотеку более высокого языка... лучше, если python или ruby). Я копаю исходный код sympy. Ничего полезного пока не нашел. - person Swair; 12.12.2012
comment
Пожалуйста, ознакомьтесь с en.wikipedia.org/wiki/Automatic_ Differentiation, чтобы узнать о некоторых надежных методах и некоторые ссылки на библиотеки. - person begemotv2718; 12.12.2012