- 积分
- 57
- 注册时间
- 2006-1-10
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2007-7-30 17:26:03
|
显示全部楼层
来自 北京海淀
第四种方法:用dblquad调用网络。
为了简单说明这个方法先给一个例子,peaks函数的例子- dblquad(@(x,y) peaks(x,y),-3,3,-3,3)
- ans =
- 13.057098664914852
复制代码 dblquad调用网络得出的值:- [X,Y] = meshgrid(-3:.25:3);
- Z = peaks(X,Y);%生成网络训练样本
- input=[X(:)';Y(:)'];%网络输入
- output=[Z(:)'];%网络输出
- net=newrb(input,output,0.00001,0.5);%生成peaks的逼近网络
- dblquad(@(x,y) sim(net,[x(:)';y*ones(size(x(:)') )]),-3,3,-3,3)
- NEWRB, neurons = 0, SSE = 1189.19
- NEWRB, neurons = 25, SSE = 7.94428
- NEWRB, neurons = 50, SSE = 0.531099
- NEWRB, neurons = 75, SSE = 0.0676809
- NEWRB, neurons = 100, SSE = 0.00777982
- NEWRB, neurons = 125, SSE = 0.00143653
- NEWRB, neurons = 150, SSE = 0.000216292
- NEWRB, neurons = 175, SSE = 6.17855e-005
- NEWRB, neurons = 200, SSE = 2.02683e-005
- ans =
- 13.057095719412455
复制代码 可以看出精度非常好了。
回到原题:
原题第四种方法代码如下:- function INT=rbf_dblquad(inf_u,inf_v,nn)
- %inf_u,u无穷上限的近似
- %inf_v,v无穷上限的近似,
- %nn,u,v积分限区间的等分个数
- [UI,VI]=meshgrid(linspace(0,inf_u,nn+1),linspace(0,inf_v,nn+1));
- UI=(UI(1:end-1,1:end-1)+UI(2:end,2:end))/2;
- VI=(VI(1:end-1,1:end-1)+VI(2:end,2:end))/2;%生成nn*nn网格的中心点
- [U,V]=meshgrid(linspace(UI(1,1),UI(1,end),nn/1.5),linspace(VI(1,1),VI(end,1),nn/1.5));%生成网络训练样本网格,样本网格均匀分布在nn*nn网格区域内,密度为UI,VI
- %网格的1/1.5
- Tf=zeros(size(U));
- for k=1:length(Tf)^2
- Tf(k)=Tf_Integrand( U(k),V(k));
- end
- %训练网络并给出足够多的Tf_Integrand函数点并计算积分
- input=[U(:)';V(:)'];%网络输入
- output=[Tf(:)'];%网络输出
- net=newrb(input,output,0.00001,3*inf_u/nn);%生成逼近网络
- INT=dblquad(@(u,v) sim(net,[u(:)';v*ones(size(u(:)'))]),0,inf_u,0,inf_v);
- function z = Tf_Integrand(u,v)
- m=1;
- n=1;
- a = 1;
- b = 1;
- km = 2*m*pi/a;
- kn = 2*n*pi/b;
- f_rel = @(x,y) (1-cos(km*x)).*(1-cos(kn*y)).*cos(u.*x+v.*y);
- f_img = @(x,y) (1-cos(km*x)).*(1-cos(kn*y)).*sin(u.*x+v.*y);
- tmp_rel = dblquad(f_rel, 0,a, 0,b);
- tmp_img = dblquad(f_img, 0,a, 0,b);
- z = (tmp_rel.^2+tmp_img.^2)./sqrt(u.^2+v.^2);
- end
- end
复制代码 和上面第3楼结果对比:- tic,[INT,intt]=alber2008(40,40,30);toc
- Elapsed time is 260.640272 seconds.
- >> INT
- INT =
- 6.9354
- tic,[INTnet,TfInet]=rbf_calc(40,40,30);toc
- NEWRB, neurons = 0, SSE = 0.45778
- NEWRB, neurons = 25, SSE = 0.047086
- NEWRB, neurons = 50, SSE = 0.00730593
- NEWRB, neurons = 75, SSE = 0.00114306
- NEWRB, neurons = 100, SSE = 0.000899809
- NEWRB, neurons = 125, SSE = 0.000185916
- NEWRB, neurons = 150, SSE = 3.66627e-005
- Elapsed time is 121.612190 seconds.
- >> INTnet
- INTnet =
- 7.0517
- tic,INT=rbf_dblquad(40,40,15);INT,toc
- NEWRB, neurons = 0, SSE = 0.138715
- NEWRB, neurons = 25, SSE = 0.00270421
- NEWRB, neurons = 50, SSE = 0.000265526
- NEWRB, neurons = 75, SSE = 4.4852e-005
- INT =
- 6.949356491559914
- Elapsed time is 53.007931 seconds.
复制代码 速度又增快不少。值得说明的是,Tf_Integrand函数在(0,0)点是奇异的,不能选取(0,0)点作为训练样本,限于神经网络外推能力的有限性,(0,0)点附近,网络给出的值存在误差,这些误差主要造成最后的积分误差。
[ 本帖最后由 rocwoods 于 2007-7-30 17:27 编辑 ] |
评分
-
1
查看全部评分
-
|