-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathScript8.fsx
More file actions
34 lines (25 loc) · 1.09 KB
/
Script8.fsx
File metadata and controls
34 lines (25 loc) · 1.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
open System
open MathNet.Numerics
open MathNet.Numerics.LinearAlgebra
open MathNet.Numerics.LinearAlgebra.Double
open MathNet.Numerics.Distributions
/// Sample points
let xdata = [ 0.0; 1.0; 2.0; 3.0; 4.0 ]
let ydata = [ 1.0; 1.4; 1.6; 1.3; 0.9 ]
let N = xdata.Length
let order = 2
/// Generating a Vandermonde row given input v
let vandermondeRow v = [for x in [0..order] do yield v ** (float x)]
/// Creating Vandermonde rows for each element in the list
let vandermonde = xdata |> Seq.map vandermondeRow |> Seq.toList
/// Create the A Matrix
let A = vandermonde |> DenseMatrix.ofRowsList N (order + 1)
A.Transpose()
/// Create the Y Matrix
let createYVector order l = [for x in [0..order] do yield l]
let Y = (createYVector order ydata |> DenseMatrix.ofRowsList (order + 1) N).Transpose()
/// Calculate coefficients using least squares
let coeffs = (A.Transpose() * A).LU().Solve(A.Transpose() * Y).Column(0)
let calculate x = (vandermondeRow(x) |> DenseVector.ofList) * coeffs
let fitxs = [(Seq.min xdata).. 0.5 ..(Seq.max xdata)]
let fitys = fitxs |> List.map calculate