| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1317 人关注过本帖
标题:[原创]辛普生二重积分程序气死我了!!救救我啊!!!
只看楼主 加入收藏
lmhllr
Rank: 8Rank: 8
等 级:贵宾
威 望:44
帖 子:1504
专家分:42
注 册:2005-5-12
收藏
 问题点数:0 回复次数:4 
[原创]辛普生二重积分程序气死我了!!救救我啊!!!
编译出现了几个同样的错误:
warning C4244: '=' : conversion from 'double ' to 'int ', possible loss of data
而且运行结果也不对,快要论文答辩了.个位大虾能不能帮帮我啊~~
还要用MATLAB画图,我都不会用.!惨了!
学校的毕业论文真是害死人啊~~又没学过的软件,怎么做啊!!!!

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <conio.h>
double  *fls(double x)
{
double *y;
y=(double *)malloc(2*sizeof(double));
     y[0]=-sqrt(1-x*x);
     y[1]=-y[0];
return y;
}
double f(double x,double y)
{
double result;
result=exp(x*x+y*y);
    return result;
}
double *simps1(double x,double eps)
{
 double *result,*y;
     int n=1,i,kflag=0;
     double h,e,t1,yy,t2,s,s0;
     result=(double *)malloc(3*sizeof(double));
     y=fls(x);
     h=0.5*(y[1]-y[0]);
     e=fabs(y[0])+fabs(y[1]);
     t1=h*(f(x,y[0])+f(x,y[1]));
     do
 {
  yy=y[0]-h;
         t2=0.5*t1;
         for(i=1;i<=n;i++)
           {
     yy=yy+2.0*h;
            t2=t2+h*f(x,yy);
           }
         s=(4.0*t2-t1)/3.0;
         n=n+n;
         if(n<8)
          {s0=s;
           t1=t2;
           h=0.5*h;
          }
         if(fabs(s-s0)<=eps*(fabs(s)+1.0))
              break;
              s0=s;
              t1=t2;
              h=0.5*h;
        }while(e+h!=e);
  if(y[0]!=y[1])
     kflag=kflag+1;
  result[0]=kflag;
  result[1]=n;
  result[2]=s;
  return(result);
}
double *simps2(double a,double b,double eps)/*a积分下限b积分上限eps给定的计算精度*/
{
  double *result,*m,n,sum,sum0;
  int n2=1,i,kflag=0,flag=0,n1,ss1,n3,ss2;
  double h,d=0,s1=0,s2=0,t1,x,t2,g=0,s=0,s0=0,c;
  result=(double *)malloc(3*sizeof(double));
  c=fabs(a)+fabs(b);
  h=0.5*(b-a);
  m=simps1(a,eps);
  n1=m[1];
  ss1=m[2];
  m=simps1(b,eps);
  n3=m[1];
  ss2=m[2];
  n=n1+n3+2;
  t1=h*(ss2+ss1);
do
  {
    x=a-h;
    t2=0.5*t1;
    for(i=1;i<=n2;i++)
    {
  x=x+2.0*h;
        m=simps1(x,eps);
  n=n+m[1]+1;
        t2=t2+h*m[2];
        }
     sum=(4.0*t2-t1)/3.0;
     n2=n2+n2;
     if(n2<8)
  {
      sum0=sum;
      t1=t2;
      h=0.5;
  }
    if(fabs(sum-sum0)<=eps*(fabs(sum)+1.0))
       {
        result[0]=kflag;
            result[1]=n;
            result[2]=sum;
      flag=1;
            break;
           }
        s0=s;
           t1=t2;
           h=0.5*h;
  }while(c+h!=c);
 if(flag==1)
 kflag=kflag+1;
 result[0]=kflag;
 result[1]=n;
 result[2]=sum;
 return(result);
}
main()
{double a,b,EPS,c;
 double *result;
 printf("请输入积分下限:\na=");
 scanf("%f",&a);
 printf("请输入积分上限:\nb=");
 scanf("%f",&b);
 printf("请输入计算精度:\nEPS=");
 scanf("%f",&EPS);
 result=simps2(a,b,EPS);
 printf("您计算的二重积分的答案是:\n");
 printf("I=%f",result[2]);
搜索更多相关主题的帖子: 辛普生 积分 
2005-05-23 14:11
shanquan
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-5-27
收藏
得分:0 

double CRealtwoDlg::fsim(double a, double b) {

int n,j; double h,d,s1,s2,t1,x,t2,g,s0,ep,s; n=1;h=0.5*(b-a); d=fabs((b-a)*1.0e-06); s1=simp3(a); s2=simp3(b); t1=h*(s1+s2); s0=1.0e+35;ep=1.0+m_eps; while(((ep>=m_eps)&&(fabs(h)>d))||(n<16)) { x=a-h;t2=0.5*t1; for(j=1;j<=n;j++) { x=x+2.0*h; g=simp3(x); t2=t2+g*h; } s=(4.0*t2-t1)/3.0; ep=fabs(s-s0)/(1.0-fabs(s)); n=n+n;s0=s;t1=t2;h=0.5*h; } return(s); } //double CRealtwoDlg::simp3(double x, double (*fsimf)(double x,double y,double z,double r), double (*fsim4s)(double x,double y[2],double z[2],double r[2])) double CRealtwoDlg::simp3(double x) { int n,i; double h,d,t1,yy,t2,g,ep,g0,s2,s1; n=1; // fsim4s(x,y[2],z[2],r[2]); h=0.5*(1.0-0.0); d=fabs(h*2.0e-06);

s2=simp2(x,1); s1=simp2(x,0); t1=h*(s1+s2); ep=1.0+m_eps;g0=1.0e+35;

while(((ep>=m_eps)&&(fabs(h)>d))||(n<16)) { yy=0.0-h; t2=0.5*t1; for(i=1;i<=n;i++) { yy=yy+2.0*h; t2=t2+h*simp2(x,yy); } g=(4.0*t2-t1)/3.0; ep=fabs(g-g0)/(1.0+fabs(g)); n=n+n;g0=g;t1=t2;h=0.5*h; } return(g);

}

file://double CRealtwoDlg::simp2(double x, double y, double (*fsimf)(double x,double y,double z,double r), double (*fsim4s)(double x,double y[2],double z[2],double r[2])) double CRealtwoDlg::simp2(double x, double y) {

int n,i; double h,d,t1,zz,t2,g,ep,g0,s1,s2;

n=1; // fsim4s(x,j1[2],j2[2],j3[2]); h=0.5*(1.0-0.0); d=fabs(h*2.0e-06);

s1=simp1(x,y,0.0); s2=simp1(x,y,1.0); t1=h*(s1+s2); ep=1.0+m_eps;g0=1.0e+35;

while(((ep>=m_eps)&&(fabs(h)>d))||(n<16)) { zz=0.0-h; t2=0.5*t1; for(i=1;i<=n;i++) { zz=zz+2.0*h; t2=t2+h*simp1(x,y,zz); } g=(4.0*t2-t1)/3.0; ep=fabs(g-g0)/(1.0+fabs(g)); n=n+n;g0=g;t1=t2;h=0.5*h; } return(g);

} double CRealtwoDlg::simp1(double x, double y, double z) { int n,i; double h,d,t1,rr,t2,g,ep,g0;

n=1; // fsim4s(x,y[2],z[2],r[2]); h=0.5*(1.0-0.0); d=fabs(h*2.0e-06);

t1=h*(fsimf(x,y,z,0.0)+fsimf(x,y,z,1.0)); ep=1.0+m_eps;g0=1.0e+35;

while(((ep>=m_eps)&&(fabs(h)>d))||(n<16)) { rr=0.0-h; t2=0.5*t1; for(i=1;i<=n;i++) { rr=rr+2.0*h; t2=t2+h*fsimf(x,y,z,rr); } g=(4.0*t2-t1)/3.0; ep=fabs(g-g0)/(1.0+fabs(g)); n=n+n;g0=g;t1=t2;h=0.5*h; } return(g);

}

我以前本科毕业设计的程序,也用到了simpson积分,而且是计算四重积分的,不过也忘的差不多了,粘了几个函数在这边。不过我记得你就是将1重的simpson看明白,二重三重直接代就行了,不难的

2005-05-27 10:01
coDavid
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-2-13
收藏
得分:0 
晕,你们是什么专业的啊?怎么毕业做这个?学数学的?不会吧~~~
学计算机?我也是学计算机的啊,我连simpson是什么都不知道。。。汗

2005-05-27 12:53
shanquan
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-5-27
收藏
得分:0 
计算机的啊,通讯方向的。
是计算方法这门课里面有这个算法的
2005-05-28 15:40
shanquan
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-5-27
收藏
得分:0 
记得那时候是海军的一个项目,是实现电磁兼容特性仿真的,那时候我们那个组4个人,我负责底层计算的,所以接触到这些无聊的算法,呵呵。
2005-05-28 15:43
快速回复:[原创]辛普生二重积分程序气死我了!!救救我啊!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017581 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved