在Ruby中评估多项式和有理函数的导数(也许是trig函数?)

时间:2014-04-24 23:21:21

标签: ruby calculus polynomials

指定主题:我正在尝试创建一个程序,它可以在特定点评估至少多项式和有理函数(trig / etc。函数也很有趣)的导数。答案应该是该特定点处的切线方程。除了使用衍生物的定义之外,我想不出任何其他方法。

我是Ruby的初学者,我正在努力制作一个简洁的小程序来计算一些衍生品。你们中的任何人都知道如何做这样的事吗?我真正想做的就是评估多项式和有理函数的导数。我感谢任何帮助。

好像我太模糊了。 我实际上不知道从哪里开始,没有代码可以显示。如果这是一个问题(怀疑作弊等),那么我将继续练习Ruby并最终弄明白。这更像是接收新代码而不是接收已编辑代码的帖子。

2 个答案:

答案 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。这非常容易,因为它将返回另一个多项式。

第三步是将公式用于两个函数的商的导数。由于这两个函数都是多项式(并且你已经对它们进行了导数定义),你就完成了。

请尝试执行此操作,并在遇到任何问题时发布问题。