laurarg 发表于 2005-5-30 16:07:55

会c语言的进来帮个忙~~~~

大家帮忙做两个题吧,同学急用,谢谢咯
1.    使用trapezium rule 求一个函数的定积分。

2.    使用Simpson’s Rule求一个函数的定积分。



%&089 %&245

milanese 发表于 2005-6-5 01:09:18

回复: 会c语言的进来帮个忙~~~~

你在Google里面搜索关键字“离散的点积分”,找的第一个网页是: http://www.zjol.com.cn/vbbible/software/program/vb/numerical/vbNumerical16.htm 。里面介绍了两种积分的方法,而且给出了VB的源代码。当初我写程序的时候用的是辛普生公式。并将对应的VB代码改写成VC代码。现将我改写后的代码再修改一下给你看看。
void C***Doc::Simpson()
{
        /*/////////////////////////////////////////////////////////////////////////
        Simpson's one-third rule:
        用于当有 N+1 个等间距取样的离散数据点,且 N 为偶数时,
        利用以下的公式即可求出积分值。h 为取样间距。
       
          f(x)dx=h/3*(F0+4*F1+2*F2+4*F3+2*F4+……+4*FN-1+FN)

        Simpson's three-eighths rule :
        用于当有 N+1 个等间距取样的离散数据点,且 N 为 3 的倍数时,
        利用以下的公式即可求出积分值。h为取样间距。
       
          f(x)dx=3*h/8*(F0+3F1+3F2+2F3+3F4+3F5+2F6+……+3FN-1+FN);

        若 N 为偶数,直接使用 Simpson's one-third rule即可求出积分;
        若 N 为奇数,则 1~(N+1-3) 个数据点可利用 Simpson's one-third rule,
        (N+1-3 )~(N+1)个数据点可利用 Simpson's three-eighths rule,
        最后再把两部分的积分值相加即可。

       Dim i As Long, j As Long, u As Long, l As Long
   Dim sum As Single, EvenPanel As Boolean
   u = UBound(fx): l = LBound(fx)
   If u - l < 2 Then MsgBox "埭汁nΤT蛹凭诼Iよi秈︽Simpson縩だ猭": Exit Function
   EvenPanel = (u - l) Mod 2 = 0
   sum = fx(l)
   For i = 1 To (u - l - IIf(EvenPanel, 0, 3) - 1)
          sum = sum + fx(i + l) * IIf(i Mod 2 = 0, 2, 4)
   Next
   sum = sum + fx(i + l)
   For j = 1 To u - i - l + 1 - IIf(EvenPanel, 1, 0)
          sum = sum + fx(j + i + l - 1) * IIf(j = 1 Or j = 4, 9, 27) / 8
   Next
   Simpson = sum * dx / 3
        /////////////////////////////////////////////////////////////////////////*/

        //        double m_dDataValue;                        //        积分前的数据数组
        //        double m_dDataIntegral;                //        积分后的数据数组

        int i=0;
        int j=0;
        int k=0;
        int switch0=0;
        int switch1=0;

        m_dDataIntegral=m_dDataValue;
        m_dDataIntegral=m_dDataValue*2+m_dDataValue;

        for(i=2;i<1024;i++)
        {
                m_dDataIntegral=m_dDataValue;
                switch0=(i%2)*3;
                for(j=0;j<i-switch0-1;j++)
                {
                        switch1=(2-(j%2))*2;
                        m_dDataIntegral+=m_dDataValue*switch1;
                }
                m_dDataIntegral+=m_dDataValue;
                switch0=1-(i%2);
                for(k=1;k<i-j-switch0;k++)
                {
                        if(k==1||k==4)
                        {
                                switch1=9;
                        }
                        else
                        {
                                switch1=27;
                        }
                        m_dDataIntegral+=m_dDataValue*switch1/8;
                }
                m_dDataIntegral/=3;
        }
}
刚出差回来,如有小问题,欢迎指正!

shaodog 发表于 2005-6-5 09:55:49

回复: 会c语言的进来帮个忙~~~~

。。。。。。。。。。。
这种程序很简单的

只要会一点基础的C或C++就能编了

P。S。算积分最好的还是用R250随机数+Monte Carlo方法
页: [1]
查看完整版本: 会c语言的进来帮个忙~~~~