3、 f = @(x,y,z)xy
xmin = 0;
xmax = 1;
ymin = 0;
ymax = @(x) 2-2x;
zmin = 0;
zmax = @(x,y) 3(1-x-y/2);
I=integral3(f,xmin,xmax,ymin,ymax,zmin,zmax )
4、syms x
f=cos(x);
ft=taylor(cos(x),x,0,'Order',8)
5、x=-6:01:6;y=x;[x,y]=meshgrid(x,y);z1=x^2+y^2;z2=real(sqrt(4-x^2-y^2));
surfc(x,y,z1),hold on
surfc(x,y,z2),hold off
figure,surfc(x,y,z1)
figure,surfc(x,y,z2)
MATLAB上重积分的计算方法综述
MATLAB中采用数值方法计算重积分,我所知范围内有以下资源可用:
1、对于积分上下限为固定值的情况,可以使用dblquad和triplequad函数;
2、对于积分上下限不是固定值的情况(即所谓一般区域的重积分),有以下几种方法:
最笨的做法是所谓的拓展函数法,也就是把被积函数乘上一个与积分限有关的逻辑表达式,然后调用dblquad或triplequad。这种做法效率很低,误差大,而且对于复杂积分区域的逻辑表达式也比较难写,所以很少用。
从2009a开始,增加了对一般区域二重积分的计算函数quad2d,但没有一般区域三重积分的计算函数。
第三方NIT工具箱有二重积分的quad2dggen函数。
从2012a开始,增加了integral、integral2和integral3函数。这几个函数比起早期的quad系列函数有不少改进,比如支持瑕积分以及任意区域的重积分,如果使用的是2012a之后的版本,建议使用这组函数。我猜测这几个函数应该也可以移植到早期的版本上使用,但没试。
如果使用的MATLAB版本较低(但至少应在70以上),可以使用SimWe仿真科技论坛rocwoods 版主提出的方法,该方法主要使用匿名函数以及arrayfun两种工具,受到不少人的推崇,还出版了一本相关的书(当然,只是部分内容)。我这里使用的就是这种方法。
借助于符号数学工具箱的int函数,即使不能求出显式解,多数情况下也能使用vpa得到足够精度的结果,但耗时往往较长(具体情况与符号运算内核有关)。
实例
1、三重积分
>> a=1;b=2;>> quadl(@(xx) arrayfun(@(x) quadl(@(yy) arrayfun(@(y) quadl(@(z) a(8-b)^2/((x-1)^2+y^2+z^2)^2,15,sqrt(2405-y^2-(x-1)^2)),yy),-sqrt(0156-(x-1)^2),sqrt(0156-(x-1)^2)),xx),1,1394968)
ans =
00405
2、二重积分
>> a=1;b=2;>> quadl(@(xx) arrayfun(@(x) quadl(@(y) a(8-b)^2/((x-1)^2+y^2+(x^2+y^2)^2)^3,x^2-2,x^3-1),xx),1,4)
ans =
17039
说明
1、不太清晰,有些符号看不太清楚(尤其是积分限),请自行认真核实。
2、第一题的三重积分,我把积分上限原来的1395进行微调,改为1394968,这是因为,如果按照1395计算,则y的积分限根号下的内容可能取值
>> 0156-(1395-1)^2ans =
-25000e-005
从而导致结果出现复数。
3、关于我使用的方法,要说清楚需要花点时间。度娘不让贴链接,如果想详细了解,你可以自行搜索一下“一般区域二重、三重积分MATLAB计算方法”相关的内容。我上传的附件是该论坛另一位高手bainhome 把相关内容做成PDF文件,可供参考。不过,我觉得如果花点时间看看论坛原帖的讨论,可能有更大收获。
4、我使用符号的习惯与rocwoods原作略有区别。
#include <stdioh>
int main()
{
int i,max,sum=0;
char str[100],ch,maxc;
scanf("%s",str);
max=0;ch=str[0];
for(i=0;str[i]!='\0';i++)
{
if(str[i]==ch) sum++;
else
if(sum>max){
max=sum;
maxc=ch;
sum=1;
ch=str[i];
}
}
for(i=0;i<max;i++) printf("%c",maxc);
return 0;
}
我以前回答过相关的问题,比较全面的总结了MATLAB计算数值积分的相关方法。可以百度“求助大神,这样的积分如何积”,应该第一个链接就是。之所以没直接贴出链接,是因为怕度娘抽风。
这里简单说一下(更详细的内容最好还是看一下我以前的回答):
1、如果使用2009a之后的版本,可以使用函数quad2d计算一般区域的二重积分,但没有一般区域三重积分的计算函数。
2、从2012a开始,增加了integral、integral2和integral3函数。这几个函数比起早期的quad系列函数有不少改进,比如支持瑕积分以及任意区域的重积分,如果使用的是2012a之后的版本,建议使用这组函数。这几个函数应该也可以移植到早期的版本上使用。
3、如果使用的MATLAB版本较低(但至少应在71也就是R14SP3以上),可以使用SimWe仿真科技论坛rocwoods 版主提出的方法(该方法主要使用了匿名函数以及arrayfun两种语言特性)。
你现在的积分表达式有些可疑——对y积分的上下限是y的函数,这样就意味着积分结果会是关于y的表达式,与常见的三重积分不符合。如果把积分限中的y改成x,又和x的积分限存在冲突——x的范围是-4~4,那么sqrt(4-x^2)就会出现复数,所以,怀疑应该把y的积分限sqrt(4-y^2)改成sqrt(4^2-x^2),或者把x的积分限改成-2~2。
参考代码:
fun = @(x,y,z)x+y+z;xmin = -4;
xmax = 4;
ymin = @(x)-sqrt(4^2-x^2);
ymax = @(x) sqrt(4^2-x^2);
zmin = @(x,y)sqrt(x^2+y^2);
zmax = 4;
q = integral3(fun,xmin,xmax,ymin,ymax,zmin,zmax)
积分结果:
q =20106
如果用“匿名函数+arrayfun”的方法,表达式如下:
q = quadl(@(xx) arrayfun(@(x) quadl(@(yy) arrayfun(@(y) quadl(@(z) x+y+z,sqrt(x^2+y^2),4),yy),-sqrt(4^2-x^2),sqrt(4^2-x^2)),xx),-4,4)结果和用integral3相同,但所需时间要长很多。
以上就是关于gdal如何建立不带几何数据的空shape全部的内容,包括:gdal如何建立不带几何数据的空shape、cs高手来、求帮做matlab程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)