gdal如何建立不带几何数据的空shape

gdal如何建立不带几何数据的空shape,第1张

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)^2

ans =

 -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程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10088614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存