指定主题:我正在尝试创建一个程序,它可以在特定点评估至少多项式和有理函数(trig / etc。函数也很有趣)的导数。答案应该是该特定点处的切线方程。除了使用衍生物的定义之外,我想不出任何其他方法。
我是Ruby的初学者,我正在努力制作一个简洁的小程序来计算一些衍生品。你们中的任何人都知道如何做这样的事吗?我真正想做的就是评估多项式和有理函数的导数。我感谢任何帮助。
好像我太模糊了。 我实际上不知道从哪里开始,没有代码可以显示。如果这是一个问题(怀疑作弊等),那么我将继续练习Ruby并最终弄明白。这更像是接收新代码而不是接收已编辑代码的帖子。
答案 0 :(得分:1)
这是基于two-point formula described on Wikipedia的数值评估。请注意,注释中的测试值是理论答案。对于方形和立方体函数,这似乎很有效,对于平方根,这似乎是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
答案 1 :(得分:0)
首先,您需要为您的函数找到一些机器可读的表示。只要您只想为多项式和有理函数编写这个,这是可行且非常简单的(具有两个子类的类函数,第一个存储系数,第二个存储两个多项式)。
完成此操作后,您需要在多项式上定义方法derivative
。这非常容易,因为它将返回另一个多项式。
第三步是将公式用于两个函数的商的导数。由于这两个函数都是多项式(并且你已经对它们进行了导数定义),你就完成了。
请尝试执行此操作,并在遇到任何问题时发布问题。