1

我知道 Erlang 通常不用于这类事情,但是否有已经编写了积分/导数的数值函数(如 GNU Octave 中的四边形,取函数和两个数字)?

4

1 回答 1

6

您可以使用功能编程方法解决问题。

如您所知,导数定义为 dF(X) = ( F(X+dX) - F(X) ) / dX

让我们创建泛型函数,它返回派生函数:

-module( calc ).
-export( [ d/2 ] ).

d( F, Dx ) ->
        fun( X ) ->
                ( F( X + Dx ) - F ( X ) ) / Dx
        end.

解释器中的使用示例:

1> c(calc).
{ok,calc}
2> 

让我们定义Sqr函数:( X * X )

2> Sqr = fun( X ) -> X * X end.
#Fun<erl_eval.6.82930912>
3> 

让我们从Sqr得到导数

3> DSqr = calc:d( Sqr, 0.001 ).
#Fun<calc.0.111170057>
4> 

检查Sqr函数:

4> [ Sqr( X ) || X <- lists:seq( 1, 10 ) ].
[1,4,9,16,25,36,49,64,81,100]
5> 

并检查导数(如您所知 - (X * X) 的导数是 (2 * X))

5> [ DSqr( X ) || X <- lists:seq( 1, 10 ) ].
[2.0009999999996975,4.000999999999699,6.000999999999479,
 8.0010000000037,10.001000000002591,12.001000000005035,
 14.00100000000748,16.000999999988608,18.000999999983947,
 20.000999999993496]

因为使用dX = 0.001的有限值- 我们没有得到明确的结果,但它非常接近真实[ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 ]

积分函数可以用类似的方式定义。定积分是:

定积分公式

所以反导数是:

在此处输入图像描述

F(0)- 持续的。而定积分可以通过任何数值积分算法来表示。

于 2012-08-21T10:31:28.910 回答