F#:微分函数 [英] F#: Derivative Function

查看:100
本文介绍了F#:微分函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试弄清楚如何使此功能正常工作.我对F#非常无能,因此不胜感激,

I'm trying to figure out how to get this function to work. I'm very inept with F#, so explanations are appreciated,

let deriv (f:(float->float), dx: float) = 
    fun f:(float -> float) * dx:float -> x:float -> float
let (f, dx, x) = ((f(x + dx) - f(x))/dx)

我使用f:(float->float)是错误的吗?

推荐答案

我将彻底地解释它,而不是试图解决您的问题.

In stead of trying to fix your problems I will explain it from the ground up.

符号派生是一个接受一个函数并返回一个新函数的函数.但是,您正在尝试计算数字导数,该函数将返回给定功能,值的值,和一个增量.

The symbolic derivative is a function that takes a function and returns a new function. However you are trying to calculate the numeric derivative that returns a value given a function, a value, and a delta.

首先,我们将给函数命名:deriv 它需要三个参数:
1.一个接受浮点数并返回浮点数的函数:(f : float -> float)
2.求导数的值:(x0 : float)
3.增量:(dx : float)

First we will give the function a name: deriv and it needs three parameters:
1. A function that takes in a float and returns a float: (f : float -> float)
2. A value of where the derivative is to be evaluated: (x0 : float)
3. A delta: (dx : float)

您在示例中拥有三个参数中的两个,但缺少了x0.

You had two of the three parameters in your example, but were missing x0.

它还应该返回一个浮点数.

It should also return a float.

所以签名是

deriv (f : (float -> float)) (x0 : float) (dx : float) : float

现在计算数值导数. 我不会解释,只是参考衍生产品

Now to calculate the numeric derivative. I won't explain this, but just reference derivative

在此示例中,我们将使用一个具有导数x^2的简单函数.

For this example we'll use a simple function that has derivative, x^2.

这是F#中的代码

// val deriv : f:(float -> float) -> x0:float -> dx:float -> float
let deriv (f : (float -> float)) (x0 : float) (dx : float) : float =
    let (x1 : float) = x0 - dx
    let (x2 : float) = x0 + dx
    let (y1 : float) = f x1
    let (y2 : float) = f x2
    let (result : float) = (y2 - y1) / (x2 - x1)
    result

// val f : x:float -> float
let f x = x**2.0

并通过快速测试表明它可以正常工作.

and a quick test show it works correctly.

// val it : float = 2.0
deriv f 1.0 0.000005

对于一系列值进行更彻底的测试.

For a more thorough test of a range of values.

使用 Visual Studio NuGet 安装在F#Interactive中

In F# Interactive

#I "..\packages"
#load "FSharp.Charting.0.90.13\FSharp.Charting.fsx"
open FSharp.Charting

let xs1 = [ for x in (double)(-3.10) .. 0.05 .. 3.10 do yield x]
let ys1 = xs1 |> List.map f
let values1 = List.zip xs1 ys1
Chart.Line(values1)
    .WithXAxis(Min=(-4.0), Max=4.0, MajorTickMark = ChartTypes.TickMark(Interval=2.0, IntervalOffset = 1.0, LineWidth = 2))
    .WithYAxis(Min=(0.0), Max=10.0, MajorTickMark = ChartTypes.TickMark(Interval=2.0, IntervalOffset = 1.0, LineWidth = 2))

也可以使用Wolfram Alpha进行确认: x ^ 2

which can also be confirmed using Wolfram Alpha: x^2

一个简单的例子:

// val d : x:float -> float
let d x = deriv f x 0.00000005

let xs2 = [ for x in (double)(-3.10) .. 0.05 .. 3.10 do yield x]
let ys2 = xs2 |> List.map d
let values2 = List.zip xs2 ys2
Chart.Line(values2)
    .WithXAxis(Min=(-4.0), Max=4.0, MajorTickMark = ChartTypes.TickMark(Interval=2.0, IntervalOffset = 1.0, LineWidth = 2))
    .WithYAxis(Min=(-6.0), Max=6.0, MajorTickMark = ChartTypes.TickMark(Interval=2.0, IntervalOffset = 1.0, LineWidth = 2))

也可以使用Wolfram Alpha进行确认: d/dx x ^ 2

which can also be confirmed using Wolfram Alpha: d/dx x^2

这篇关于F#:微分函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆