Оценка производных полиномиальных и рациональных функций в Ruby (может быть, тригонометрические функции также?)
Чтобы уточнить тему: я пытаюсь создать программу, которая может оценивать производные по крайней мере от полиномиальных и рациональных функций (функции trig / etc. Также были бы интересны) в определенной точке. Ответом должно быть уравнение касательной в этой конкретной точке. Я не могу придумать никакого способа сделать это, кроме как с помощью определения производной.
Я новичок в Ruby и пытаюсь создать небольшую программу для вычисления некоторых производных. Кто-нибудь из вас знает, как сделать что-то подобное? Все, чего я действительно хочу, это оценить производные полиномиальных и рациональных функций. Я ценю любую помощь.
Кажется, я был слишком расплывчатым. Я буквально не знаю, с чего начать, и у меня нет кода для показа. Если это проблема (подозрение на мошенничество и т. Д.), Тогда я продолжу практиковать Ruby и в конце концов выясню это. Это было скорее сообщение о получении нового кода, чем о получении отредактированного кода.
2 ответа
Вот числовая оценка, основанная на формуле из двух пунктов, описанной в Википедии. Обратите внимание, что тестовые значения в комментариях являются теоретическими ответами. Это, кажется, работает довольно хорошо для функций квадрата и куба и до 9 десятичных знаков для квадратного корня.
# First argument is the function to be evaluated, as a Ruby lambda.
# Second argument is the value at which to evaluate the derivative.
# Returns a numeric approximation to f'(x), using machine epsilon
# scaling to avoid numerical instability issues that would occur if
# the h (delta-x) value is too close to zero.
def derivative(f = lambda {|value| value}, x) # default f(x) = x
h = x * Math.sqrt(Float::EPSILON)
lower = x - h
upper = x + h
(f[upper] - f[lower]) / (upper - lower)
end
square = lambda {|value| value * value} # or value**2 if you prefer
p derivative(square, 1.0) # 2 * x = 2.0
p derivative(square, 2.0) # 2 * x = 4.0
p derivative(square, 3.0) # 2 * x = 6.0
square_root = lambda {|value| Math.sqrt(value)}
p derivative(square_root, 1.0) # 1 / (2*sqrt(x)) = 0.5
p derivative(square_root, 2.0) # 1 / (2*sqrt(x)) = 0.35355339059327373
p derivative(square_root, 3.0) # 1 / (2*sqrt(x)) = 0.2886751345948129
cube = lambda {|value| value * value * value} # or value**3 if you prefer
p derivative(cube, 1.0) # 3 * x**2 = 3.0
p derivative(cube, 2.0) # 3 * x**2 = 12.0
p derivative(cube, 3.0) # 3 * x**2 = 27.0
Во-первых, вам нужно найти машиночитаемое представление для ваших функций. Пока вы хотите написать это только для полиномиальной и рациональной функции, это выполнимо и довольно просто (класс Function с двумя подклассами, первый хранит коэффициенты, второй - два полинома).
Как только это будет сделано, вам нужно определить метод derivative
на полином. Это очень легко, так как он вернет другой многочлен.
Третий шаг - использовать формулу для производной отношения двух функций. Поскольку обе функции являются полиномами (и у вас уже есть производные определения для них), все готово.
Пожалуйста, попробуйте реализовать это и опубликуйте вопрос, если у вас возникнут какие-либо проблемы.