如题,谢谢!

解决方案 »

  1.   

    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前几天有人问过
      

  2.   

    用程序计算积分的数值是最好弄了,就是一段一段加起来。并不是所有的积分都能解除公式,但是都能解出数值。如区间为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上机调试过了。很好
      

  3.   

    对于自然指数exp(-x平方)的积分,上限是无穷大,这个怎么取有限值啊?还望楼上的达人再赐教
      

  4.   

    你可以试算一下exp(-x平方),让x一点一点大起来,什么时候数值等于零了,说明对计算机而言,已经到精度极限了,再大也没有用了。就以这个X值作为定积分的上限。一般来说,如果精度不是很接近计算机精度极限的(如,用Double,而结果只要12位有效数字),就不用数值修正。误差在12位以后。
      

  5.   

    那exp这个函数在VB中是自带的吗?在什么类里呢?就是会有一个End class 的结尾的那种类,刚学VB,我也不知道是不是这个叫法:)请多指教
      

  6.   

    exp这个函数在VB中是自带的。
    我在下围棋,下好后给你编一个吧。就计算exp(-x平方)。下限就算是-2。
      

  7.   

    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
      

  8.   

    你可以把步长改大一点,如 StepLen = 0.0001,数值是差不多的。
      

  9.   

    出现错误:未声明名称"Exp"。
    这是怎么回事呢?
    代码设计器里应该放什么呢?
    麻烦了
      

  10.   

    代码我是调试过的,没问题。上面的代码就是从 VB 的 IDE 里复制来的。Exp 是 VB 的自带函数,代码设计器里不用放什么东西。
      

  11.   

    那我就直接新建一个项目,然后双击窗体
    把你的代码复制在
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load    End Sub
    的下面,结果就出现上面的错误
    说:未声明名称的"Exp"。
    我是不是漏了什么步骤?
    真是太麻烦你了
      

  12.   

    你可以查找一下函数,可能在.net里 Exp 的名称改了,也可能数学公式需要引入东西,就像C语言需要Math.h 一样。
    我对.net的不太懂,但计算积分的原理就这些,是一样的。
      

  13.   

    我已经查到Exp这个函数,写的是成员属于:system.math
    这个怎么调用啊?
      

  14.   

    可能在模块前要加一句 Imports System.math
      

  15.   

    已经搞定Exp的归属问题,关键怎么看结果值呢?
    print这个函数在运行的时候好像不能被识别,是不是有其他值的显示语句?
      

  16.   

    这个程序运行起来是不是比较慢啊?
    我试着把print这个语句删掉,应该没问题的吧,等运行完可以在临时窗口看sum的值
    可是程序一直在运行,什么时候停啊
    而且我把下限改为1了,其实我是在求一个误差函数
    就是ERFC的值
      

  17.   

    定积分的数值近似计算的方法应该有多种吧,上面的
    “sum = sum + (f1 + f2) / 2 * h”应该属于线性插值法, 
    要想真正提高精度,不是说缩小步长就可以的,
    应该考虑非线性插值,比如2次插值(抛物线插值法)或者更高...对于广义积分,可以设置精度,每次计算都保留上一次积分和,如果两次积分和的差小于指定的精度,就停止计算。
      

  18.   

    容我在啰嗦一句,去图书馆找一本积分数值计算的编程书(我以前看过,很不错),
    上面是c代码,你把他们改成VB就行了。或者你把C代码抄出来,让这些高手帮你改成VB就OK了。
      

  19.   

    你的数值的精度太高了,比如有64位,则运行到什么时候啊。可以将If TempNum = 0改为If TempNum = 0.00000000001
      

  20.   

    订正:将If TempNum = 0改为If TempNum <= 0.00000000001
      

  21.   

    还是国内好啊,还有图书馆,还有达人帮你把C翻成VB
    早知道就多学点编程的再出来,现在旁边书一大堆,可是全是日文,看得我眼花花
    只好到这里来求救了
     YaDa():
    我已经按你的改了
      

  22.   

    我的2秒钟出结果,如果步长该短一点,一瞬间出结果,精度还能保证5位以上有效数字。
    用 TempNum = 0 ,2秒钟出结果 1.76830840779191
    用 TempNum <= 0.00000000001 ,一秒钟出结果。1.76830840779191, 答案一样。
    用 TempNum <= 0.0000000001 ,半秒钟出结果。1.76830840778274, 
    步长改为StepLen = 0.0001 一瞬间出结果。1.76830923192695
      

  23.   

    注意:TempNum <= 0.00000000001 是小于等于,也可以小于,不能等于。我是马上订正的,否则极可能死循环。
      

  24.   

    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
    我这样应该也是可以的吧?怎么还是出不来结果呢?
      

  25.   

    你就把 Double 改成 single 试试。
      

  26.   

    你把我的代码改坏了。至少 Sum = Sum * StepLen 是在循环以后的。
      

  27.   

    首先就象Yada()指出的那样,Sum = Sum * StepLen 是在循环以后的。
    然后我就在
    '先计算上限
            Do Until TempNum <= 0.00000000001
                TempNum = System.Math.Exp(-i * i)
                i = i + StepLen的前面
    加了一句 TempNum = 1
    也就是说先给TempNum赋值,然后再循环
      

  28.   

    这就是你把我的代码改坏了。你自己想想吧。TempNum没赋值前,缺省为零。你却把我的For i = -2 To LimitS Step StepLen 改为 Do Until TempNum <= 0.00000000001 ,他还会执行吗?