找回密码
 注册

新浪微博登陆

只需一步, 快速开始

QQ登录

只需一步,快速开始

快捷导航
事务所专题-柯南20周年纪念事件簿
搜索
查看: 418|回复: 2

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

[复制链接]

杯户小学生

发表于 2005-5-30 16:07:55 | 显示全部楼层 |阅读模式
大家帮忙做两个题吧,同学急用,谢谢咯
1.    使用trapezium rule 求一个函数的定积分。

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



%&089 %&245


杯户大学生

发表于 2005-6-5 01:09:18 | 显示全部楼层

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

你在Google里面搜索关键字“离散的点积分”,找的第一个网页是: http://www.zjol.com.cn/vbbible/s ... l/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[4096];                        //        积分前的数据数组
        //        double m_dDataIntegral[4096];                //        积分后的数据数组

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

        m_dDataIntegral[0]=m_dDataValue[0];
        m_dDataIntegral[1]=m_dDataValue[0]*2+m_dDataValue[1];

        for(i=2;i<1024;i++)
        {
                m_dDataIntegral=m_dDataValue[0];
                switch0=(i%2)*3;
                for(j=0;j<i-switch0-1;j++)
                {
                        switch1=(2-(j%2))*2;
                        m_dDataIntegral+=m_dDataValue[j+1]*switch1;
                }
                m_dDataIntegral+=m_dDataValue[j+1];
                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[k+j]*switch1/8;
                }
                m_dDataIntegral/=3;
        }
}
刚出差回来,如有小问题,欢迎指正!
回复 喝彩 无视

使用道具 举报

杯户小学生

发表于 2005-6-5 09:55:49 | 显示全部楼层

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

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

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

P。S。算积分最好的还是用R250随机数+Monte Carlo方法
回复 喝彩 无视

使用道具 举报

您需要登录后才可以回帖 登录 | 注册 新浪微博登陆

本版积分规则

Archiver|手机版|小黑屋|名侦探柯南事务所 ( 沪ICP备05038770号 )

GMT+8, 2025-2-3 13:53 , Processed in 0.070818 second(s), 14 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表