Private Sub Command1_Click() Debug.Print trapez(0, 1, 100) End SubPublic Function trapez(ByVal a!, ByVal b!, ByVal n&) As Single 'b、a分别为积分上下限,n为等分数 Dim sum!, h!, x!, i&, f1!, f2! h = (b - a) / n f1 = f(a) sum = 0 For i = 1 To n x = a + i * h f2 = f(x) sum = sum + (f1 + f2) / 2 * h f1 = f2 Next i trapez = sum End FunctionPrivate Function f(x As Single) f = Exp(x) End Function前几天有人问过
用程序计算积分的数值是最好弄了,就是一段一段加起来。并不是所有的积分都能解除公式,但是都能解出数值。如区间为1至4.5的X平方的定积分,可以这样编写程序。 Private Sub Command1_Click() Dim i As Double Dim Sum As Double '定积分的解 Dim StepLen As Double '步长 Sum = 0 StepLen = 0.00001 '步长细一点通常精度高一点,运算次数也多一点 For i = 1 To 4.5 Step StepLen Sum = Sum + i * i Next Sum = Sum * StepLen Print Sum '看一下结果 End Sub上机调试过了。很好
Private Sub Command1_Click() Dim i As Double Dim Sum As Double '定积分的解 Dim StepLen As Double '步长 Dim LimitS As Double Dim TempNum As Double Sum = 0 StepLen = 0.00001 '步长细一点通常精度高一点,运算次数也多一点
'先计算上限 Do TempNum = Exp(-i * i) i = i + StepLen If TempNum = 0 Then Exit Do Loop LimitS = i
'再计算积分 For i = -2 To LimitS Step StepLen Sum = Sum + Exp(-i * i) Next Sum = Sum * StepLen Print Sum '看一下结果End Sub
你可以把步长改大一点,如 StepLen = 0.0001,数值是差不多的。
出现错误:未声明名称"Exp"。 这是怎么回事呢? 代码设计器里应该放什么呢? 麻烦了
代码我是调试过的,没问题。上面的代码就是从 VB 的 IDE 里复制来的。Exp 是 VB 的自带函数,代码设计器里不用放什么东西。
那我就直接新建一个项目,然后双击窗体 把你的代码复制在 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub 的下面,结果就出现上面的错误 说:未声明名称的"Exp"。 我是不是漏了什么步骤? 真是太麻烦你了
Private Sub Command1_Click() Dim i As Double Dim Sum As Double '定积分的解 Dim StepLen As Double '步长 Dim LimitS As Double Dim TempNum As Double Sum = 0 StepLen = 0.00001 '步长细一点通常精度高一点,运算次数也多一点 '先计算上限 Do Until TempNum <= 0.00000000001 TempNum = System.Math.Exp(-i * i) i = i + StepLen Loop LimitS = i i = 1 '再计算积分 Do Until i >= LimitS Sum = Sum + System.Math.Exp(-i * i) Sum = Sum * StepLen i = i + StepLen Loop Print(Sum) '看一下结果 End Sub 我这样应该也是可以的吧?怎么还是出不来结果呢?
你就把 Double 改成 single 试试。
你把我的代码改坏了。至少 Sum = Sum * StepLen 是在循环以后的。
首先就象Yada()指出的那样,Sum = Sum * StepLen 是在循环以后的。 然后我就在 '先计算上限 Do Until TempNum <= 0.00000000001 TempNum = System.Math.Exp(-i * i) i = i + StepLen的前面 加了一句 TempNum = 1 也就是说先给TempNum赋值,然后再循环
这就是你把我的代码改坏了。你自己想想吧。TempNum没赋值前,缺省为零。你却把我的For i = -2 To LimitS Step StepLen 改为 Do Until TempNum <= 0.00000000001 ,他还会执行吗?
Debug.Print trapez(0, 1, 100)
End SubPublic Function trapez(ByVal a!, ByVal b!, ByVal n&) As Single
'b、a分别为积分上下限,n为等分数
Dim sum!, h!, x!, i&, f1!, f2!
h = (b - a) / n
f1 = f(a)
sum = 0
For i = 1 To n
x = a + i * h
f2 = f(x)
sum = sum + (f1 + f2) / 2 * h
f1 = f2
Next i
trapez = sum
End FunctionPrivate Function f(x As Single)
f = Exp(x)
End Function前几天有人问过
Private Sub Command1_Click()
Dim i As Double
Dim Sum As Double '定积分的解
Dim StepLen As Double '步长
Sum = 0
StepLen = 0.00001 '步长细一点通常精度高一点,运算次数也多一点
For i = 1 To 4.5 Step StepLen
Sum = Sum + i * i
Next
Sum = Sum * StepLen
Print Sum '看一下结果
End Sub上机调试过了。很好
我在下围棋,下好后给你编一个吧。就计算exp(-x平方)。下限就算是-2。
Dim i As Double
Dim Sum As Double '定积分的解
Dim StepLen As Double '步长
Dim LimitS As Double
Dim TempNum As Double Sum = 0
StepLen = 0.00001 '步长细一点通常精度高一点,运算次数也多一点
'先计算上限
Do
TempNum = Exp(-i * i)
i = i + StepLen
If TempNum = 0 Then Exit Do
Loop
LimitS = i
'再计算积分
For i = -2 To LimitS Step StepLen
Sum = Sum + Exp(-i * i)
Next
Sum = Sum * StepLen
Print Sum '看一下结果End Sub
这是怎么回事呢?
代码设计器里应该放什么呢?
麻烦了
把你的代码复制在
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub
的下面,结果就出现上面的错误
说:未声明名称的"Exp"。
我是不是漏了什么步骤?
真是太麻烦你了
我对.net的不太懂,但计算积分的原理就这些,是一样的。
这个怎么调用啊?
print这个函数在运行的时候好像不能被识别,是不是有其他值的显示语句?
我试着把print这个语句删掉,应该没问题的吧,等运行完可以在临时窗口看sum的值
可是程序一直在运行,什么时候停啊
而且我把下限改为1了,其实我是在求一个误差函数
就是ERFC的值
“sum = sum + (f1 + f2) / 2 * h”应该属于线性插值法,
要想真正提高精度,不是说缩小步长就可以的,
应该考虑非线性插值,比如2次插值(抛物线插值法)或者更高...对于广义积分,可以设置精度,每次计算都保留上一次积分和,如果两次积分和的差小于指定的精度,就停止计算。
上面是c代码,你把他们改成VB就行了。或者你把C代码抄出来,让这些高手帮你改成VB就OK了。
早知道就多学点编程的再出来,现在旁边书一大堆,可是全是日文,看得我眼花花
只好到这里来求救了
YaDa():
我已经按你的改了
用 TempNum = 0 ,2秒钟出结果 1.76830840779191
用 TempNum <= 0.00000000001 ,一秒钟出结果。1.76830840779191, 答案一样。
用 TempNum <= 0.0000000001 ,半秒钟出结果。1.76830840778274,
步长改为StepLen = 0.0001 一瞬间出结果。1.76830923192695
Dim i As Double
Dim Sum As Double '定积分的解
Dim StepLen As Double '步长
Dim LimitS As Double
Dim TempNum As Double Sum = 0
StepLen = 0.00001 '步长细一点通常精度高一点,运算次数也多一点 '先计算上限
Do Until TempNum <= 0.00000000001
TempNum = System.Math.Exp(-i * i)
i = i + StepLen Loop
LimitS = i
i = 1
'再计算积分
Do Until i >= LimitS
Sum = Sum + System.Math.Exp(-i * i)
Sum = Sum * StepLen
i = i + StepLen
Loop
Print(Sum) '看一下结果 End Sub
我这样应该也是可以的吧?怎么还是出不来结果呢?
然后我就在
'先计算上限
Do Until TempNum <= 0.00000000001
TempNum = System.Math.Exp(-i * i)
i = i + StepLen的前面
加了一句 TempNum = 1
也就是说先给TempNum赋值,然后再循环