24小时热门版块排行榜    

Znn3bq.jpeg
查看: 2175  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 一志愿上海大学生物学346 +4 上海大学346调剂 2026-04-03 4/200 2026-04-09 10:52 by yiminglu
[考研] 求调剂材料科学与工程一志愿985初试365分 +4 材化李可 2026-04-08 4/200 2026-04-09 08:46 by 5268321
[考研] 专硕0854初试考材科基,求调剂 +7 3220548044 2026-04-06 10/500 2026-04-08 21:59 by hypershenger
[考研] 085501机械英二77总分294求调剂,接受跨专业学习 +5 守法公民亓纪 2026-04-08 5/250 2026-04-08 21:19 by bljnqdcc
[考研] 本科211,293分请求调剂 +12 莲菜就是藕吧 2026-04-03 13/650 2026-04-08 20:30 by 背对大海出发
[考研] 一志愿南昌大学,085600,344分求调剂 +11 调剂上岸玘 2026-04-05 12/600 2026-04-08 16:17 by luoyongfeng
[考研] 298求调剂 +4 残荷新柳 2026-04-07 4/200 2026-04-07 23:02 by lbsjt
[考研] 22408 一志愿双一流人工智能300分 四六级,数据分析国奖 +4 zzfeng123 2026-04-06 6/300 2026-04-07 21:02 by zzfeng123
[考研] 22408 318分求调剂 +4 勤奋的小笼包 2026-04-06 6/300 2026-04-07 15:05 by 纸鹤555
[考研] 0854求调剂 +9 亨氏番茄沙司 2026-04-06 10/500 2026-04-07 14:37 by shdgaomin
[考研] 269电子信息求调剂,可转专业 +5 独酌wl 2026-04-06 5/250 2026-04-06 17:23 by 土木硕士招生
[考研] 285求调剂 +5 mapmath 2026-04-06 6/300 2026-04-06 17:18 by 蓝云思雨
[考研] 一志愿南航,数一英一学硕317求调剂!! +6 Acaciad 2026-04-04 6/300 2026-04-06 12:13 by 考研学校招点人
[考研] 求调剂 +10 chenxrlkx 2026-04-05 10/500 2026-04-06 11:31 by 猪会飞
[考研] 308求调剂 +4 maverick^_^ 2026-04-03 4/200 2026-04-05 19:08 by 蓝云思雨
[考研] 085500机械专硕初试288求调剂 +3 GZJguo666- 2026-04-05 3/150 2026-04-05 18:06 by jkddd
[考研] 328分调剂 +6 门men 2026-04-04 6/300 2026-04-05 13:40 by imissbao
[论文投稿] 求文献 5+3 ys879651$ 2026-04-02 3/150 2026-04-04 17:22 by bobvan
[考研] 一志愿沪985,326分求调剂 +3 刘墨墨 2026-04-03 3/150 2026-04-04 11:16 by 悲伤的芋头
[考研] 289-求调剂 +4 这里是_ 2026-04-03 4/200 2026-04-03 14:23 by 1753564080
信息提示
请填处理意见