声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5041|回复: 11

[综合讨论] 怎样求分段函数的定积分啊??????????????????

[复制链接]
发表于 2006-11-13 15:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
两个函数都是分段函数,求它们的积的积分,比如当x在[0,0.5]时f(x)=1-6*x,当x在[0.5,1]时,f(x)=5-6*x;另一个函数g(x)的表达式则为当x在[0,0.5]时g(x)=sqrt(3)*(1-4*x);当x在[0.5,1]时,g(x)=sqrt(3)*(4*x-3);求这个两个函数相乘后在[0,1]区间的积分.
急啊,大虾给指教!!!!!!!!!!!!!


[ 本帖最后由 lianwuyu 于 2006-11-13 15:57 编辑 ]

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2006-11-13 16:06 | 显示全部楼层

回复

最简单的一种方法就是,分两段将f(x)和 g(x)相乘后,分别积分后再相加.
即:先在[0,0.5]中,将f(x)和 g(x)相应表达式代入,积分;
       再在 [0.5,1]中,也将 f(x)和 g(x)相应表达式代入,积分.
  二者相加即为所求.积分可用quad,quad8,用法参见help.
 楼主| 发表于 2006-11-13 16:14 | 显示全部楼层
可是如果两个函数的分段区间不是一致的话怎么办??比如一个在[0,0.4][0.4,1]而另一个在[0,0.6][0.6,1]
 楼主| 发表于 2006-11-13 16:16 | 显示全部楼层
我将f(x)和g(x)分别编为两个函数
function f=fx(x)
if x>=0 & x<0.5
    f=1-6*x;
elseif x==0.5
    f=0;
elseif x>0.5 & x<=1
    f=5-6*x;
end

function f=gx(x)
if x>=0 & x<=0.5
    f=sqrt(3)*(1-4*x);
elseif x>0.5 & x<=1
    f=sqrt(3)*(4*x-3);
end
    然后调用语句quad不可以吗?比如a=quad(@fx.*@gx,0,1),显示出错,错在哪怎么改
发表于 2006-11-13 16:31 | 显示全部楼层

回复

区间不一致时,可以利用高数知识先进行人工分析,写好复合函数 h(x)=f(x)*g(x)在相应区间的表达式后,再进行计算.

评分

1

查看全部评分

 楼主| 发表于 2006-11-13 17:59 | 显示全部楼层
非要一个区间一个区间的分开后求每个区间的函数积以后在积分吗?那还要编程做什么啊,比如积分区间可以用一个变量表示,每个区间的积分都去调用一个数组里的数,这样就可以把区间保存在一个数组里,区间改变的话只要修改数组的值就可以了,是不是积分函数quad里只能有一个变量啊,不可以编个函数做吗??
发表于 2006-11-13 18:52 | 显示全部楼层

回复

任何程序都希望更好、更快地解决问题。如果能优化程序,何不先优化再编程呢?
虽然你这个问题可以直接编程,但显然比优化后的程序复杂很多。
发表于 2006-11-13 18:59 | 显示全部楼层
非要一个区间一个区间的分开后求每个区间的函数积以后在积分吗?那还要编程做什么啊

被积函数比较复杂的时候,你有办法不编程就求积分?请教你怎么做...-_-|||
区间保存在一个数组里,区间改变的话只要修改数组的值就可以了...不可以编个函数做吗?

去看看num2str命令,类似的帖子多得都滥掉了
你的问题十分简单,我没有验证,随手写了一下,基本思想都在里面:
  1. str1='((1-6*x).*(x>=0&x<=.5)+(5-6*x).*(x>=.5&x<=1))';
  2. str2='((sqrt(3)*(1-4*x)).*(x>=0&x<=.4)+(sqrt(3)*(4*x-3)).*(x>=.4&x<=1))';
  3. str=[str1,'.*',str2];
  4. f=inline(str,'x');
  5. q=quadl(f,0,1)
复制代码

btw:刚才还没有看见上面的帖子...匿名函数之间怎么可能实现点乘,创造力有点儿过头了吧:lol

[ 本帖最后由 bainhome 于 2006-11-13 19:03 编辑 ]
 楼主| 发表于 2006-11-13 19:51 | 显示全部楼层
我要做大量的分段积分,就是f(x)和 g(x)是不断变化的,但是f(x)和 g(x)都是一次的函数,所以通式是ax+b;所以我把系数a,b都寸在一个二维的数组了,每次运算f(x)和 g(x)的乘积积分都只要把系数改变就可以了,比如你上面说的例子
str1='((1-6*x).*(x>=0&x<=.5)+(5-6*x).*(x>=.5&x<=1))';
str2='((sqrt(3)*(1-4*x)).*(x>=0&x<=.4)+(sqrt(3)*(4*x-3)).*(x>=.4&x<=1))';
str=[str1,'.*',str2];
f=inline(str,'x');
q=quadl(f,0,1)

a1=-6;
b1=1;
c1=-6;
d1=5;
a2=-4*sqrt(3);
b2=sqrt(3);
c2=4*sqrt(3);
d2=-3*sqrt(3);
然后把你的代码改成
str1='((a1*x+b1).*(x>=0&x<=.5)+(c1*x+d1).*(x>=.5&x<=1))';
str2='((a2*x+b2).*(x>=0&x<=.4)+(c2*x+d2).*(x>=.4&x<=1))';
str=[str1,'.*',str2];
f=inline(str,'x');
q=quadl(f,0,1);
这样又出了错了
 楼主| 发表于 2006-11-13 19:52 | 显示全部楼层
匿名函数之间不可能实现乘积,象我这种情况有什么办法实现吗?
比如两个分段 函数相乘,两个分段函数都是很复杂的,有的还要分个十多段,象这样就不可能一个一个把表达式写出来相乘啊,比如两个都是分十段,而且两个函数的分段原则还不一样,那这样要相乘积分不就的分个几十次,所以肯定要用到匿名的函数处理啊,请教,如何用匿名的函数呢???

[ 本帖最后由 lianwuyu 于 2006-11-13 20:01 编辑 ]
发表于 2006-11-13 20:49 | 显示全部楼层
1.分段函数分十多段不叫复杂,分段原则一不一样对计算也没有影响,问这个问题说明你根本没有仔细分析我给的程序,上面我给的程序两个函数的分段原则也不一样,甚至两个相乘函数的积分区间不一样也照可以做。
2.从你代入数值的方法来看,说明你也根本没有仔细看我的帖子中的文字内容,上面我让你去看num2str命令的用法,照做了吗?如果所有的f和g中的子项都是ax+b型相乘,那问题简直简单得一塌糊涂——循环写入一个string即可。
3.“肯定”二字不要随便写,类似的问题不用@而用inline,一样可以解决,比你这种积分复杂很多的我也做过,从没用过匿名函数照实现!
仔细琢磨吧^_^

评分

1

查看全部评分

发表于 2006-12-15 14:44 | 显示全部楼层

回复 #11 bainhome 的帖子

请bainhome再详细说明解决方法,感激不尽
“a1=-6;
b1=1;
c1=-6;
d1=5;
a2=-4*sqrt(3);
b2=sqrt(3);
c2=4*sqrt(3);
d2=-3*sqrt(3);

str1='((a1*x+b1).*(x>=0&x<=.5)+(c1*x+d1).*(x>=.5&x<=1))';
str2='((a2*x+b2).*(x>=0&x<=.4)+(c2*x+d2).*(x>=.4&x<=1))';
str=[str1,'.*',str2];
f=inline(str,'x');
q=quadl(f,0,1);”
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-19 16:23 , Processed in 0.059753 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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