该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
之前一直用Matlab,最近想学一些Mathematica。听说MMA的数值计算效率和Matlab不相上下,但实际测试感觉差别太大,不知该怎么优化。如下一个简单的例子,用Jacobi迭代法解Laplace方程,速度可相差20倍左右。用MMA的NDSolve解速度会快一些,但仍大幅度慢于Matlab,请教大家有什么好方法?
Mathematica
n = 32; (*grid size*)
h = 1/(n - 1); (*grid spacing*)
u =
Table[0., {n}, {n}];(*init to zero*)
u[[1, All]] = 100;(*B.C.*)
Do[
u[[2 ;; n - 1, 2 ;; n - 1]] =
Table[1/4 (u[[i - 1, j]] + u[[i + 1, j]] + u[[i, j - 1]] +
u[[i, j + 1]]), {i, 2, n - 1}, {j, 2, n - 1}],
100]
ListPlot3D[u, PlotRange -> All, ImagePadding -> 20, Mesh -> {n, n},
ImageSize -> 300, PlotLabel -> "solution of Laplace PDE on 2D"]
Matlab
clear all; close all;
n = 32;
h = 1/(n-1); %grid spacing
u = zeros(n,n);
u(1,:) = 100; %B.C.
% coordinates
[X,Y] = meshgrid(0:h:1,0:h:1);
for k=1:100
tmp = u;
for i=2:n-1
for j=2:n-1
tmp(i,j)=...
(1/4)*(u(i-1,j)+u(i+1,j)+...
u(i,j-1)+u(i,j+1));
end
end
u=tmp;
end
mesh(X,Y,u);
title('solution of Laplace PDE on 2D');
set(gcf,'Position',[10,10,320,320]);