Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
69
Task/Steffensens-method/FreeBASIC/steffensens-method.basic
Normal file
69
Task/Steffensens-method/FreeBASIC/steffensens-method.basic
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
Function aitken(f As Function(As Double) As Double, p0 As Double) As Double
|
||||
Dim As Double p1 = f(p0)
|
||||
Dim As Double p2 = f(p1)
|
||||
Dim As Double p1m0 = p1 - p0
|
||||
|
||||
Return p0 - (p1m0 * p1m0) / (p2 - (2 * p1) + p0)
|
||||
End Function
|
||||
|
||||
Function steffensenAitken(f As Function(As Double) As Double, pinit As Double, tol As Double, maxiter As Integer) As Double
|
||||
Dim As Double p0 = pinit
|
||||
Dim As Double p = aitken(f, p0)
|
||||
Dim As Integer iter = 1
|
||||
While Abs(p-p0) > tol Andalso iter < maxiter
|
||||
p0 = p
|
||||
p = aitken (f, p0)
|
||||
iter += 1
|
||||
Wend
|
||||
|
||||
If Abs (p - p0) > tol Then Return 0 Else Return p
|
||||
End Function
|
||||
|
||||
Function deCasteljau(c0 As Double, c1 As Double, c2 As Double, t As Double) As Double
|
||||
Dim As Double s = 1 - t
|
||||
Dim As Double c01 = (s * c0) + (t * c1)
|
||||
Dim As Double c12 = (s * c1) + (t * c2)
|
||||
Dim As Double c012 = (s * c01) + (t * c12)
|
||||
Return c012
|
||||
End Function
|
||||
|
||||
Function xConvexLeftParabola(t As Double) As Double
|
||||
Return deCasteljau(2, -8, 2, t)
|
||||
End Function
|
||||
|
||||
Function yConvexLeftParabola(t As Double) As Double
|
||||
Return deCasteljau(1, 2, 3, t)
|
||||
End Function
|
||||
|
||||
Function implicitEquation(x As Double, y As Double) As Double
|
||||
Return (5 * x * x) + y - 5
|
||||
End Function
|
||||
|
||||
Function f(t As Double) As Double
|
||||
Dim As Double x = xConvexLeftParabola(t)
|
||||
Dim As Double y = yConvexLeftParabola(t)
|
||||
|
||||
Return implicitEquation(x, y) + t
|
||||
End Function
|
||||
|
||||
Dim As Double t0 = 0
|
||||
|
||||
For i As Integer = 0 To 10
|
||||
Print Using "t0 = #.# : "; t0;
|
||||
Dim As Double t = steffensenAitken(@f, t0, 0.00000001, 1000)
|
||||
If t = 0 Then
|
||||
Print "no answer"
|
||||
Else
|
||||
Dim As Double x = xConvexLeftParabola(t)
|
||||
Dim As Double y = yConvexLeftParabola(t)
|
||||
|
||||
If Abs(implicitEquation(x, y)) <= 0.000001 Then
|
||||
Print Using "intersection at (##.######, ##.######)"; x; y
|
||||
Else
|
||||
Print "spurious solution"
|
||||
End If
|
||||
End If
|
||||
t0 += 0.1
|
||||
Next
|
||||
|
||||
Sleep
|
||||
Loading…
Add table
Add a link
Reference in a new issue