📄 basicintegration.vb
字号:
' The numerical integration classes reside in the
' Extreme.Mathematics.Calculus namespace.
Imports Extreme.Mathematics.Calculus
' Function delegates reside in the Extreme.Mathematics
' namespace.
Imports Extreme.Mathematics
Namespace Extreme.Mathematics.QuickStart.VB
' Illustrates the use of the Newton-Raphson equation solver
' in the Extreme.Mathematics.EquationSolvers namespace of the Extreme
' Optimization Mathematics Library for .NET.
Module BasicIntegration
Sub Main()
' Numerical integration algorithms fall into two
' main categories: adaptive and non-adaptive.
' This QuickStart Sample illustrates the use of
' the non-adaptive numerical integrators.
'
' All numerical integration classes derive from
' NumericalIntegrator. This abstract base class
' defines properties and methods that are shared
' by all numerical integration classes.
'
' The integrand
'
' The function we are integrating must be
' provided as a RealFunction. For more
' information about this delegate, see the
' Functions QuickStart sample.
Dim f As RealFunction = _
New RealFunction(AddressOf Math.Sin)
' Variable to hold the result:
Dim result As Double
'
' SimpsonIntegrator
'
' The simplest numerical integration algorithm
' is Simpson's rule.
Dim simpson As SimpsonIntegrator = _
New SimpsonIntegrator()
' You can set the relative or absolute tolerance
' to which to evaluate the integral.
simpson.RelativeTolerance = 0.00001
' You can select the type of tolerance using the
' ConvergenceCriterion property:
simpson.ConvergenceCriterion = _
ConvergenceCriterion.WithinRelativeTolerance
' The Integrate method performs the actual
' integration:
result = simpson.Integrate(f, 0, 5)
Console.WriteLine("sin(x) on [0,2]")
Console.WriteLine("Simpson integrator:")
' The result is also available in the Result
' property:
Console.WriteLine(" Value: {0}", simpson.Result)
' To see whether the algorithm ended normally,
' inspect the IterationResultCode property:
Console.WriteLine(" ResultCode: {0}", _
simpson.IterationResultCode)
' You can find out the estimated error of the result
' through the EstimatedError property:
Console.WriteLine(" Estimated error: {0}", _
simpson.EstimatedError)
' The number of iterations to achieve the result
' is available through the IterationsNeeded property.
Console.WriteLine(" Iterations: {0}", _
simpson.IterationsNeeded)
' The number of function evaluations is available
' through the FunctionEvaluationsNeeded property.
Console.WriteLine(" Function evaluations: {0}", _
simpson.FunctionEvaluationsNeeded)
'
' Gauss-Kronrod Integration
'
' Gauss-Kronrod integrators also use a fixed point
' scheme, but with certain optimizations in the
' choice of points where the integrand is evaluated.
'
' The Extreme.Mathematics.Calculus namespace contains a series
' of Gauss-Kronrod integrators that are mainly used
' as an integration rule for the adaptive
' integrator. No iteration is used.
' Here's the 21-point rule:
Dim gk21 As GaussKronrodIntegrator21 = _
New GaussKronrodIntegrator21()
gk21.Integrate(f, 0, 5)
Console.WriteLine("21 point Gauss-Kronrod rule:")
Console.WriteLine(" Value: {0}", gk21.Result)
Console.WriteLine(" ResultCode: {0}", _
gk21.IterationResultCode)
Console.WriteLine(" Estimated error: {0}", _
gk21.EstimatedError)
Console.WriteLine(" Iterations: {0}", _
gk21.IterationsNeeded)
Console.WriteLine(" Function evaluations: {0}", _
gk21.FunctionEvaluationsNeeded)
' The NonAdaptiveGaussKronrodIntegrator uses a
' succession of 10, 21, 43, and 87 point rules
' to approximate the integral.
Dim nagk As NonAdaptiveGaussKronrodIntegrator = _
New NonAdaptiveGaussKronrodIntegrator()
nagk.Integrate(f, 0, 5)
Console.WriteLine("Non-adaptive Gauss-Kronrod rule:")
Console.WriteLine(" Value: {0}", nagk.Result)
Console.WriteLine(" ResultCode: {0}", _
nagk.IterationResultCode)
Console.WriteLine(" Estimated error: {0}", _
nagk.EstimatedError)
Console.WriteLine(" Iterations: {0}", _
nagk.IterationsNeeded)
Console.WriteLine(" Function evaluations: {0}", _
nagk.FunctionEvaluationsNeeded)
'
' Romberg Integration
'
' Romberg integration combines Simpson's Rule
' with a scheme to accelerate convergence.
' This algorithm is useful for smooth integrands.
Dim romberg As RombergIntegrator = _
New RombergIntegrator()
result = romberg.Integrate(f, 0, 5)
Console.WriteLine("Romberg integration:")
Console.WriteLine(" Value: {0}", romberg.Result)
Console.WriteLine(" ResultCode: {0}", _
romberg.IterationResultCode)
Console.WriteLine(" Estimated error: {0}", _
romberg.EstimatedError)
Console.WriteLine(" Iterations: {0}", _
romberg.IterationsNeeded)
Console.WriteLine(" Function evaluations: {0}", _
romberg.FunctionEvaluationsNeeded)
' However, it breaks down if the integration
' algorithm contains singularities or
' discontinuities.
f = New RealFunction(AddressOf HardIntegrand)
result = romberg.Integrate(f, 0, 1)
Console.WriteLine("Romberg on hard integrand:")
Console.WriteLine(" Value: {0}", romberg.Result)
Console.WriteLine(" Actual value: 100")
Console.WriteLine(" ResultCode: {0}", _
romberg.IterationResultCode)
Console.WriteLine(" Estimated error: {0}", _
romberg.EstimatedError)
Console.WriteLine(" Iterations: {0}", _
romberg.IterationsNeeded)
Console.WriteLine(" Function evaluations: {0}", _
romberg.FunctionEvaluationsNeeded)
Console.Write("Press Enter key to exit...")
Console.ReadLine()
End Sub
' Function that will cause difficulties to the
' simplistic integration algorithms.
Private Function HardIntegrand(ByVal x As Double) As Double
' This is put in because some integration rules
' evaluate the function at x=0.
If (x <= 0) Then
Return 0
End If
Return Math.Pow(x, -0.9) * Math.Log(1 / x)
End Function
End Module
End Namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -