当前位置:文档之家› MATLAB精通科学计算_偏微分方程求解

MATLAB精通科学计算_偏微分方程求解

一、Maple V 系统Maple V是由Waterloo大学开发的数学系统软件,它不但具有精确的数值处理功能,而且具有无以伦比的符号计算功能。

Maple V的符号计算能力还是MathCAD和MATLAB等软件的符号处理的核心。

Maple提供了2000余种数学函数,涉及范围包括:普通数学、高等数学、线性代数、数论、离散数学、图形学。

它还提供了一套内置的编程语言,用户可以开发自己的应用程序,而且Maple自身的2000多种函数,基本上是用此语言开发的。

Maple采用字符行输入方式,输入时需要按照规定的格式输入,虽然与一般常见的数学格式不同,但灵活方便,也很容易理解。

输出则可以选择字符方式和图形方式,产生的图形结果可以很方便地剪贴到Windows应用程序内。

二、MATLAB 系统MATLAB原是矩阵实验室(Matrix Laboratory)在70年代用来提供Linpack和Eispac k软件包的接口程序,采用C语言编写。

从80年代出现3.0的DOS版本,逐渐成为科技计算、视图交互系统和程序语言。

MATLAB可以运行在十几个操作平台上,比较常见的有基于W indows 9X/NT、OS/2、Macintosh、Sun、Unix、Linux等平台的系统。

MATLAB程序主要由主程序和各种工具包组成,其中主程序包含数百个内部核心函数,工具包则包括复杂系统仿真、信号处理工具包、系统识别工具包、优化工具包、神经网络工具包、控制系统工具包、μ分析和综合工具包、样条工具包、符号数学工具包、图像处理工具包、统计工具包等。

而且5.x版本还包含一套几十个的PDF文件,从MATLAB的使用入门到其他专题应用均有详细的介绍。

MATLAB是数值计算的先锋,它以矩阵作为基本数据单位,在应用线性代数、数理统计、自动控制、数字信号处理、动态系统仿真方面已经成为首选工具,同时也是科研工作人员和大学生、研究生进行科学研究的得力工具。

MATLAB在输入方面也很方便,可以使用内部的E ditor或者其他任何字符处理器,同时它还可以与Word6.0/7.0结合在一起,在Word的页面里直接调用MATLAB的大部分功能,使Word具有特殊的计算能力。

三、MathCAD 系统MathCAD是美国Mathsoft公司推出的一个交互式的数学系统软件。

从早期的DOS下的1. 0和Windows下的4.0版本,到今日的8.0版本,功能也从简单的数值计算,直至引用Map le强大的符号计算能力,使得它发生了一个质的飞跃。

MathCAD是集文本编辑、数学计算、程序编辑和仿真于一体的软件。

MathCAD7.0 Profe ssional(专业版)运行在Win9X/NT下,它的主要特点是输入格式与人们习惯的数学书写格式很近似,采用WYSWYG(所见所得)界面,特别适合一般无须进行复杂编程或要求比较特殊的计算。

MathCAD 7.0 Professional 还带有一个程序编辑器,对于一般比较短小,或者要求计算速度比较低时,采用它也是可以的。

这个程序编辑器的优点是语法特别简单。

MathCAD可以看作是一个功能强大的计算器,没有很复杂的规则;同时它也可以和Wor d、Lotus、WPS2000等字处理软件很好地配合使用,可以把它当作一个出色的全屏幕数学公式编辑器。

四、Mathematica 系统Mathematica是由美国物理学家Stephen Wolfram领导的Wolfram Research开发的数学系统软件。

它拥有强大的数值计算和符号计算能力,在这一方面与Maple类似,但它的符号计算不是基于Maple上的,而是自己开发的。

Mathematica的基本系统主要是用C语言开发的,因而可以比较容易地移植到各种平台上,Mathematica是一个交互式的计算系统,计算是在用户和Mathematica互相交换、传递信息数据的过程中完成的。

Mathematica系统所接受的命令都被称作表达式,系统在接受了一个表达式之后就对它进行处理,然后再把计算结果返回。

Mathematica对于输入形式有比较严格的规定,用户必须按照系统规定的数学格式输入,系统才能正确地处理,不过由于3. 0版本引入输入面板,并且可以修改、重组输入面板,因此以前版本输入指令时需要不断切换大小写字符的繁琐方式得到很好的改善。

3.0版本可以用各种格式保存文件和剪贴内容,包括RTF、HTML、BMP等格式。

五、四种软件的比较选用何种数学软件?如果仅仅是要求一般的计算或者是普通用户日常使用,首选的是Ma thCAD,它在高等数学方面所具有的能力,足够一般客户的要求,而且它的输入界面也特别友好。

如果要求计算精度、符号计算和编程方面的话,最好同时使用Maple和Mathematica,它们在符号处理方面各具特色,有些Maple不能处理的,Mathematica却能处理,诸如某些积分、求极限等方面,这些都是比较特殊的。

如果要求进行矩阵方面或图形方面的处理,则选择MATLAB,它的矩阵计算和图形处理方面则是它的强项,同时利用MATLAB的NoteBook 功能,结合Word6.0/7.0的编辑功能,可以很方便地处理科技文章。

1.2 满足Neumann边界条件的Helmholtz方程源程序:function [u,x,y] = Helmholtz_Newton(f,g,dbx,bx0,bxf,by0,byf,D,Mx,My,M inErr,MaxIter)%解方程: u_xx + u_yy + g(x,y)u = f(x,y)% 自变量取值区域 D = [x0,xf,y0,yf] = {(x,y) |x0 <= x <= xf, y0 <= y < = yf}% 边界条件% u(x0,y) = bx0(y), u(xf,y) = bxf(y)% u(x,y0) = by0(x), u(x,yf) = byf(x)% x轴均分为Mx段% y轴均分为My段% tol 误差因子% MaxIter: 最大迭代次数x0 = D(1); xf = D(2); y0 = D(3); yf = D(4);dx = (xf - x0)/Mx; x = x0 + [0:Mx]*dx;%构造内点数组dy = (yf - y0)/My; y = y0 + [0:My]'*dy;Mx1 = Mx + 1; My1 = My + 1;for i = 1:Mxfor j = 1:MyF(i,j) = f(x(i),y(j)); G(i,j) = g(x(i),y(j));endenddx2 = dx*dx; dy2 = dy*dy; dxy2 = 2*(dx2 + dy2);rx = dx2/dxy2; ry = dy2/dxy2; rxy = rx*dy2;%边界条件for m = 1:My1u([1 Mx1],m)=[bx0(y(m)) bxf(y(m))]; %左右边界endfor n = 1:Mx1u(n,[1 My1]) = [by0(x(n)); byf(x(n))];%上下边界end%边界平均值作迭代初值sum_of_bv = sum(sum([u([1 Mx1],2:My) u(2:Mx,[1 My1])']));u(2:Mx,2:My) = sum_of_bv/(2*(Mx + My - 2));for itr = 1:MaxIterfor i = 2:(Mx1-1)u(i,1)=2*ry*u(i,2)+rx*(u(i+1,1)+u(i-1,1))+rxy*(G(i,1)*u(i,1)-F(i,1)-2*dbx(x(i),y(1))/dx);endfor j=2:(My1-1)u(1,j)=ry*(u(1,j+1)+u(1,j-1))+2*rx*u(2,j)+rxy*(G(1,j)*u(1,j)-F(1,j)-2*dbx(x(1),y(j))/dy);endfor i= 2:Mxfor j = 2:Myu(i,j) = ry*(u(i+1,j)+u(i-1,j)) + rx*(u(i,j-1)+u(i,j+1))+ rxy*(G(i,j)*u(i,j)- F(i,j)); %迭代公式endendif itr > 1 & max(max(abs(u - u0))) < MinErr%循环结束条件break;endu0 = u;endu=u';例1.1迭代法求解满足Neumann型边界条件的Helmholtz方程应用实例。

求以下满足Neumann型边界条件的的数值解:自变量取值:边界:解:可知,在MATLAB中编写脚本文件:f = inline('x^2+y^2','x','y');g = inline('sqrt(x)','x','y');x0 = 0; xf = 4; y0 = 0; yf = 4;%自变量取值范围Mx = 50;My = 30;%等分段数dbx=inline('x^2+y^2','x','y');bx0 = inline('y^2','y'); %边界条件bxf = inline('4^2*cos(y)','y');by0 = inline('x^2','x');byf = inline('4^2*cos(x)','x');D = [x0 xf y0 yf]; MaxIter = 100; MinErr = 1e-4;[U,x,y] = Helmholtz_Newton(f,g,dbx,bx0,bxf,by0,byf,D,Mx,My,MinErr,Max Iter);clf, mesh(U)xlabel('x')ylabel('y')zlabel('U')2 抛物形偏微分方程2.1显式前向欧拉法源程序:function [u,x,t] = EF_Euler(A,xf,T,it0,bx0,bxf,M,N)%解方程 A u_xx = u_t , 0 <= x <= xf, 0 <= t <= T%初值: u(x,0) = it0(x)% 边界条件: u(0,t) = bx0(t), u(xf,t) = bxf(t)% M : x 轴的等分段数% N : t 轴的等分段数dx = xf/M; x = [0:M]*dx;dt = T/N; t = [0:N]'*dt;for i= 1:M + 1u(i,1) = it0(x(i));endfor j = 1:N + 1u([1 M + 1],j) = [bx0(t(j)); bxf(t(j))];endr = A*dt/dx/dx, r1 = 1 - 2*r;if(r>0.5)disp('r>0.5,unstability');endfor j = 1:Nfor i = 2:Mu(i,j+1) = r*(u(i + 1,j) + u(i-1,j)) + r1*u(i,j); %(9.2.3) endendu=u';例2.1显式前向欧拉法求解一维抛物性方程应用实例。

相关主题