24小时热门版块排行榜    

查看: 2133  |  回复: 15

muqiuyan

木虫 (小有名气)

[交流] 【求助】求积分程序中被积函数问题 已有5人参与

我用Simpson方法计算定积分。在程序中有两个地方用到积分,而被积分函数作为子程序调用,在计算积分的程序中该怎么定义被积函数呢?

这是 辛普森算法 的程序:
double fsimp(a,b,eps) /*辛普森算法*/  
double a,b,eps; /*a为积分下限,b为积分上限,eps是希望达到的精度*/  
{  
    int n,k;  
    double h,t1,t2,s1,s2,ep,p,x;  
    n=1; h=b-a;  
    t1=h*(fsimpf(a)+fsimpf(b))/2.0;  /*用梯形公式求出一个大概的估值*/  
    s1=t1;  
    printf("s1=%e\n",s1);
        ep=eps+1.0;  
    while (ep>=eps)  
{  
p=0.0;  
for (k=0;k<=n-1;k++)  
{  
x=a+(k+0.5)*h;  
p=p+fsimpf(x);  
}  
t2=(t1+h*p)/2.0;  
s2=(4.0*t2-t1)/3.0;  
printf("s2=%e\n",s2);
ep=fabs(s2-s1);  
t1=t2; s1=s2; n=n+n; h=h/2.0;  
}  
    return(s2);  
}



这是被积函数的程序:

double fsimpf(r)
double r; /* 被积分的函数*/

{  double y;
    y=被积函数f(x)的表达式;
  return(y);
}


两个被积函数不能都用fsimpf()表示吧,可不用它,计算积分时调用被积函数又是用fsimpf()表示的:


怎么区分啊
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

simthhuang

木虫 (小有名气)

★ ★
muqiuyan(金币+1):谢谢参与
resonant(金币+1):感谢积极参与:-) 2010-05-21 17:38:39
哪里有两个被积函数啊?明明就一个嘛!
一贯知足二目远眺三餐有节四季不懒五谷皆食六欲不张七分忍让八方交往九薄烟断十分坦荡
2楼2010-05-21 17:04:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

muqiuyan

木虫 (小有名气)

引用回帖:
Originally posted by simthhuang at 2010-05-21 17:04:29:
哪里有两个被积函数啊?明明就一个嘛!

主程序里有两个被积函数,我只列了两个子程序,一个是计算积分的,一个是被积函数的子程序,想问问第二个被积函数怎么弄,积分子程序里的f(a) f(b) f(x) 之类的需要调要被积函数子程序的地方要不要调整。
3楼2010-05-21 21:46:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

simthhuang

木虫 (小有名气)


resonant(金币+1):感谢参与:-) 2010-05-22 21:01:25
第二个被积函数就是被积函数啊,就是积分号和dx之间那部分啊。f(a) f(b) f(x) 分别是用初值a,终值b和中间迭代的数x调用被积函数。MM,我的理解对吗?
一贯知足二目远眺三餐有节四季不懒五谷皆食六欲不张七分忍让八方交往九薄烟断十分坦荡
4楼2010-05-22 19:41:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

muqiuyan

木虫 (小有名气)

resonant:调用函数没有什么特别的吧?区分只要函数名不同不就可以区分么? 2010-05-24 11:09:30
引用回帖:
Originally posted by simthhuang at 2010-05-22 19:41:04:
第二个被积函数就是被积函数啊,就是积分号和dx之间那部分啊。f(a) f(b) f(x) 分别是用初值a,终值b和中间迭代的数x调用被积函数。MM,我的理解对吗?

可能是我表达的不清楚。我要弄一个很复杂的程序,有很多公式,其中有两个计算积分的式子,所以我编了一个计算积分的子程序,就是fsimp(a,b,eps);这其中就涉及到调用被积函数,那我的两个被积函数怎么调用呢,怎么区分开呢

PS:你是学计算机的吗,能认识下吗?
5楼2010-05-23 10:37:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

archun

铜虫 (初入文坛)

★ ★
muqiuyan(金币+1):谢谢参与
jjdg(金币+1):感谢热心应助 2010-05-26 04:51:38
muqiuyan(金币+2): 2010-05-26 09:21:19
我觉得你是这个意思吧。
你有两个函数要算积分,比如为 fsimpf1(x) 和 fsimpf2(x)
但是算积分的函数只有一个,就是 fsimp()
在 fsimp() 中有一句语句是 p=p+fsimpf(x),但是在 fsimpf(x) 的定义中只定义了一个函数,比如是 fsimpf1(x)。这样的话,你算第二个积分时,仍然要调用 fsimp() 函数算。但是 fsimp() 是调用的 fsimpf1(x) 不是 fsimpf2(x)。你就不知道 fsimpf2(x) 该怎么算了。

你可以增加一个参数解决问题。
比如:
double fsimp(double a, double b, double eps, int func_index)
{
    .....
    .....
    p=p+fsimpf(x,func_index)
    .....
    .....
}

double fsimpf(double x, int func_index)
{
    swtich (func_index)
    {
    case 1:
        return (3*x+5); //第一个函数
        break;
    case 2:
        return (x*x+5); //第二个函数
        break;
    ........
    ........
    }
}

你积分时就写为
fsimp(a,b,eps,1) 积分第一个函数
fsimp(a,b,eps,2) 积分第二个函数
6楼2010-05-25 22:04:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

muqiuyan

木虫 (小有名气)

引用回帖:
Originally posted by archun at 2010-05-25 22:04:35:
我觉得你是这个意思吧。
你有两个函数要算积分,比如为 fsimpf1(x) 和 fsimpf2(x)
但是算积分的函数只有一个,就是 fsimp()
在 fsimp() 中有一句语句是 p=p+fsimpf(x),但是在 fsimpf(x) 的定义中只定义了一个 ...

太感谢了,
那积分程序中的原来的fsimpf(a)就写成fsimpf(a,func_index),fsimpf(b)写成fsimpf(b,func_index),是吗?
另外我的两个被积函数是很复杂的式子,在哪里计算它们呢?下面的程序对吗
double fsimpf(double x, int func_index)
{


    swtich (func_index)
    {
    case 1:

double y1;
    y1=被积函数 fsimpf1(x) 的表达式;
      return (y1); //第一个函数
        break;

    case 2:
double y2;
    y2=被积函数 fsimpf1(x) 的表达式;
        return (y2); //第二个函数
        break;
    ........
    ........
    }
}
7楼2010-05-26 09:21:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

archun

铜虫 (初入文坛)


余泽成(金币+1):参与应助,欢迎常来程序语言版! 2010-05-28 08:57:25
muqiuyan(金币+1): 2010-06-01 16:30:55
对的。
其实那个break语句可以不用写。只不过写也不错。
8楼2010-05-28 06:04:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

muqiuyan

木虫 (小有名气)

引用回帖:
Originally posted by archun at 2010-05-28 06:04:01:
对的。
其实那个break语句可以不用写。只不过写也不错。

我的积分变量也是两个,怎么区分呢?一个是半径r;一个是温度T。哪些地方需要更改?
9楼2010-06-01 16:32:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjyl

金虫 (正式写手)

★ ★
muqiuyan(金币+1):谢谢参与
resonant(金币+1):感谢应助:-) 2010-06-02 19:03:48
muqiuyan(金币+1): 2010-06-03 10:15:13
最近比较忙,没有怎么回帖。

简单地说一下吧,建议你使用函数指针,不然程序照你这样写以后又要修改积分的函数那你还得改。
double fsimp(double (*f)(double ),double a, double b, double eps) /  /*a为积分下限,b为积分上限,eps是希望达到的精度,f为函数指针*/
在fsimp 的实现中,你就写f(a),f(b) 就是了。
前面申明double fsimpf(double)
然后在调用 fsimp时就直接
xx=fsimp(fsimpf, double a, double b, double eps) ;就是了
建议你看看the c programming language
10楼2010-06-02 18:44:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 muqiuyan 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 考研化学学硕调剂,一志愿985 +4 张vvvv 2026-03-15 6/300 2026-03-17 17:15 by ruiyingmiao
[考研] 085601求调剂 +4 Du.11 2026-03-16 4/200 2026-03-17 17:08 by ruiyingmiao
[考研] 085600材料与化工求调剂 +5 绪幸与子 2026-03-17 5/250 2026-03-17 16:40 by laoshidan
[考研] 有没有道铁/土木的想调剂南林,给自己招师弟中~ +3 TqlXswl 2026-03-16 7/350 2026-03-17 15:23 by TqlXswl
[考研] [导师推荐]西南科技大学国防/材料导师推荐 +3 尖角小荷 2026-03-16 6/300 2026-03-16 23:21 by 尖角小荷
[考研] 环境工程调剂 +6 大可digkids 2026-03-16 6/300 2026-03-16 17:16 by barlinike
[考研] 304求调剂 +3 曼殊2266 2026-03-14 3/150 2026-03-16 16:39 by houyaoxu
[考研] 289求调剂 +4 这么名字咋样 2026-03-14 6/300 2026-03-14 18:58 by userper
[考研] 复试调剂 +4 z1z2z3879 2026-03-14 5/250 2026-03-14 16:30 by JourneyLucky
[考研] 331求调剂(0703有机化学 +5 ZY-05 2026-03-13 6/300 2026-03-14 10:51 by Jy?
[考研] 学硕285求调剂 +13 Wisjxn 2026-03-12 46/2300 2026-03-14 10:33 by JourneyLucky
[考研] 285 求调剂 资源与环境 一志愿北京化工大学 +3 未名考生 2026-03-10 3/150 2026-03-13 23:04 by JourneyLucky
[考研] 304求调剂 +6 Mochaaaa 2026-03-12 7/350 2026-03-13 22:18 by 星空星月
[考研] 材料工程调剂 +9 咪咪空空 2026-03-12 9/450 2026-03-13 22:05 by 星空星月
[考研] 290求调剂 +9 ADT 2026-03-11 9/450 2026-03-13 21:55 by JourneyLucky
[考研] 工科,求调剂 +3 我887 2026-03-11 3/150 2026-03-13 21:39 by JourneyLucky
[考研] 0703化学求调剂 +7 绿豆芹菜汤 2026-03-12 7/350 2026-03-13 17:25 by njzyff
[考研] 工科材料085601 279求调剂 +8 困于星晨 2026-03-12 10/500 2026-03-13 15:42 by ms629
[考研] 333求调剂 +3 152697 2026-03-12 4/200 2026-03-13 07:08 by Iveryant
[考研] 420求调剂 +4 莫向外求11 2026-03-10 6/300 2026-03-12 14:41 by ruiyingmiao
信息提示
请填处理意见