lianwuyu 发表于 2006-11-13 15:54

怎样求分段函数的定积分啊??????????????????

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

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

xjzuo 发表于 2006-11-13 16:06

回复

最简单的一种方法就是,分两段将f(x)和 g(x)相乘后,分别积分后再相加.
即:先在中,将f(x)和 g(x)相应表达式代入,积分;
       再在 中,也将 f(x)和 g(x)相应表达式代入,积分.
  二者相加即为所求.积分可用quad,quad8,用法参见help.

lianwuyu 发表于 2006-11-13 16:14

可是如果两个函数的分段区间不是一致的话怎么办??比如一个在而另一个在

lianwuyu 发表于 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),显示出错,错在哪怎么改

xjzuo 发表于 2006-11-13 16:31

回复

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

lianwuyu 发表于 2006-11-13 17:59

非要一个区间一个区间的分开后求每个区间的函数积以后在积分吗?那还要编程做什么啊,比如积分区间可以用一个变量表示,每个区间的积分都去调用一个数组里的数,这样就可以把区间保存在一个数组里,区间改变的话只要修改数组的值就可以了,是不是积分函数quad里只能有一个变量啊,不可以编个函数做吗??

xjzuo 发表于 2006-11-13 18:52

回复

任何程序都希望更好、更快地解决问题。如果能优化程序,何不先优化再编程呢?
虽然你这个问题可以直接编程,但显然比优化后的程序复杂很多。

bainhome 发表于 2006-11-13 18:59

非要一个区间一个区间的分开后求每个区间的函数积以后在积分吗?那还要编程做什么啊
被积函数比较复杂的时候,你有办法不编程就求积分?请教你怎么做...-_-|||
区间保存在一个数组里,区间改变的话只要修改数组的值就可以了...不可以编个函数做吗?
去看看num2str命令,类似的帖子多得都滥掉了
你的问题十分简单,我没有验证,随手写了一下,基本思想都在里面:
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=;
f=inline(str,'x');
q=quadl(f,0,1)
btw:刚才还没有看见上面的帖子...匿名函数之间怎么可能实现点乘,创造力有点儿过头了吧:lol

[ 本帖最后由 bainhome 于 2006-11-13 19:03 编辑 ]

lianwuyu 发表于 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=;
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=;
f=inline(str,'x');
q=quadl(f,0,1);
这样又出了错了

lianwuyu 发表于 2006-11-13 19:52

匿名函数之间不可能实现乘积,象我这种情况有什么办法实现吗?
比如两个分段 函数相乘,两个分段函数都是很复杂的,有的还要分个十多段,象这样就不可能一个一个把表达式写出来相乘啊,比如两个都是分十段,而且两个函数的分段原则还不一样,那这样要相乘积分不就的分个几十次,所以肯定要用到匿名的函数处理啊,请教,如何用匿名的函数呢???

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

bainhome 发表于 2006-11-13 20:49

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

chen01061006 发表于 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=;
f=inline(str,'x');
q=quadl(f,0,1);”
页: [1]
查看完整版本: 怎样求分段函数的定积分啊??????????????????