其实那两个公式本来就是对离散点求积分的,即知道了某些点的函数值,求积分值。但是这两个公式要求定步长,正好你的离散点也是定步长的。这样:
Public Function trap()
s=y(1)*WB(1)
For i = 2 To 99
x(i) = a + h * i
s = s + 2 * y(i)*WB(i)
Next
s = s + y(100)*WB(100)
trap = s / 2 '你的步长应该是1
End Function
艾,怎么这样简单,是不是错了。
好象和mm_cool的差不多。
'复化simpson公式求积分,它比复化梯形公式收敛的快。
'待求积分表达式
'x为表达式中变量值
Public Function expression(x As Single) As Single
expression = Sin(x) '需注意被0除的情况
End Function
'复化simpson公式求积分
'a为积分下限
'b为积分上限
'n为积分区间划分等份
Public Function simp(a As Single, b As Single, n As Integer)
Dim h As Single
Dim x() As Single
Dim s As Single
ReDim x(n) As Single
If n Mod 2 <> 0 Then Exit Function 'N必须为偶数
h = (b - a) / n '积分步长
s = expression(a)
For i = 1 To n - 1 Step 2 '复化simpson公式的精华部分
x(i) = a + h * i
s = s + 4 * expression(x(i))
Next
For i = 2 To n - 2 Step 2 '复化simpson公式的精华部分
x(i) = a + h * i
s = s + 2 * expression(x(i))
Next
s = s + expression(b)
simp = h * s / 3
End Function
Private Sub Command1_Click()
MsgBox simp(0, 3.1415926 / 4, 1000) '准确解为0.2928932
End Sub
'待求积分表达式
'x为表达式中变量值
Public Function expression(x As Single) As Single
expression = Sin(x) '需注意被0除的情况
End Function
'复化梯形公式求积分
'a为积分下限
'b为积分上限
'n为积分区间划分等份
Public Function trap(a As Single, b As Single, n As Integer)
Dim h As Single
Dim x() As Single
Dim s As Single
ReDim x(n) As Single
h = (b - a) / n '积分步长
s = expression(a)
For i = 0 To n - 1 '复化梯形公式的精华部分
x(i) = a + h * i
s = s + 2 * expression(x(i))
Next
s = s + expression(b)
trap = h * s / 2
End Function
Private Sub Command1_Click()
MsgBox trap(0, 3.1415926 / 4, 1000) '准确解为0.2928932
End Sub