我不知道这个问题与数学或编程有什么关系,我是Matlab的绝对新手。 程序FEM_50将有限元方法应用于拉普拉斯方程-Uxx(x,y)-Uyy中的Uyy(x,y)= F(x,y)。 如何更改它以将FEM应用于公式-Uxx(x,y) - Uyy(x,y)+ U(x,y)= F(x,y)? 在这个页面: http://sc.fsu.edu/~burkardt/m_src/fem_50/fem_50.html 额外的代码文件,以备不时之需。
function fem_50 ( )
%% FEM_50 applies the finite element method to Laplace's equation.
%
% Discussion:
%
% FEM_50 is a set of MATLAB routines to apply the finite
% element method to solving Laplace's equation in an arbitrary
% region, using about 50 lines of MATLAB code.
%
% FEM_50 is partly a demonstration, to show how little it
% takes to implement the finite element method (at least using
% every possible MATLAB shortcut.) The user supplies datafiles
% that specify the geometry of the region and its arrangement
% into triangular and quadrilateral elements, and the location
% and type of the boundary conditions, which can be any mixture
% of Neumann and Dirichlet.
%
% The unknown state variable U(x,y) is assumed to satisfy
% Laplace's equation:
% -Uxx(x,y) - Uyy(x,y) = F(x,y) in Omega
% with Dirichlet boundary conditions
% U(x,y) = U_D(x,y) on Gamma_D
% and Neumann boundary conditions on the outward normal derivative:
% Un(x,y) = G(x,y) on Gamma_N
% If Gamma designates the boundary of the region Omega,
% then we presume that
% Gamma = Gamma_D + Gamma_N
% but the user is free to determine which boundary conditions to
% apply. Note, however, that the problem will generally be singular
% unless at least one Dirichlet boundary condition is specified.
%
% The code uses piecewise linear basis functions for triangular elements,
% and piecewise isoparametric bilinear basis functions for quadrilateral
% elements.
%
% The user is required to supply a number of data files and MATLAB
% functions that specify the location of nodes, the grouping of nodes
% into elements, the location and value of boundary conditions, and
% the right hand side function in Laplace's equation. Note that the
% fact that the geometry is completely up to the user means that
% just about any two dimensional region can be handled, with arbitrary
% shape, including holes and islands.
%
clear
%
% Read the nodal coordinate data file.
%
load coordinates.dat;
%
% Read the triangular element data file.
%
load elements3.dat;
%
% Read the quadrilateral element data file.
%
load elements4.dat;
%
% Read the Neumann boundary condition data file.
% I THINK the purpose of the EVAL command is to create an empty NEUMANN array
% if no Neumann file is found.
%
eval ( 'load neumann.dat;', 'neumann=[];' );
%
% Read the Dirichlet boundary condition data file.
%
load dirichlet.dat;
A = sparse ( size(coordinates,1), size(coordinates,1) );
b = sparse ( size(coordinates,1), 1 );
%
% Assembly.
%
for j = 1 : size(elements3,1)
A(elements3(j,:),elements3(j,:)) = A(elements3(j,:),elements3(j,:)) ...
+ stima3(coordinates(elements3(j,:),:));
end
for j = 1 : size(elements4,1)
A(elements4(j,:),elements4(j,:)) = A(elements4(j,:),elements4(j,:)) ...
+ stima4(coordinates(elements4(j,:),:));
end
%
% Volume Forces.
%
for j = 1 : size(elements3,1)
b(elements3(j,:)) = b(elements3(j,:)) ...
+ det( [1,1,1; coordinates(elements3(j,:),:)'] ) * ...
f(sum(coordinates(elements3(j,:),:))/3)/6;
end
for j = 1 : size(elements4,1)
b(elements4(j,:)) = b(elements4(j,:)) ...
+ det([1,1,1; coordinates(elements4(j,1:3),:)'] ) * ...
f(sum(coordinates(elements4(j,:),:))/4)/4;
end
%
% Neumann conditions.
%
if ( ~isempty(neumann) )
for j = 1 : size(neumann,1)
b(neumann(j,:)) = b(neumann(j,:)) + ...
norm(coordinates(neumann(j,1),:) - coordinates(neumann(j,2),:)) * ...
g(sum(coordinates(neumann(j,:),:))/2)/2;
end
end
%
% Determine which nodes are associated with Dirichlet conditions.
% Assign the corresponding entries of U, and adjust the right hand side.
%
u = sparse ( size(coordinates,1), 1 );
BoundNodes = unique ( dirichlet );
u(BoundNodes) = u_d ( coordinates(BoundNodes,:) );
b = b - A * u;
%
% Compute the solution by solving A * U = B for the remaining unknown values of U.
%
FreeNodes = setdiff ( 1:size(coordinates,1), BoundNodes );
u(FreeNodes) = A(FreeNodes,FreeNodes) \ b(FreeNodes);
%
% Graphic representation.
%
show ( elements3, elements4, coordinates, full ( u ) );
return
end
答案 0 :(得分:4)
我不会做你的作业,......但这里有一些提示:
回到公式并找出新方程的弱形式来解决,你会注意到A矩阵的新贡献,你必须在“汇编”部分中考虑。< / p>
查找此新贡献的本地(元素方式)矩阵表达式,因此您也可以在“程序集”部分中添加它。你会看到它实际上是元素的质量矩阵。
修改所有元素类型(三角形和四边形)的“装配部分”
etvoilà,...
这是“干净”的做法。实际上还有另一种方法几乎不需要修改所提供的程序。只需将其转换为Matlab函数,即可使用不同的体力(F(x,y))重复求解原始问题。
然后,反复调用此函数,将体力修改为:
New_body_Force = Original_body_force - Solution_from_previous_call
这应该收敛到期望的结果。
这第二个选项不像首先提出的“干净”方式那么优雅,但我喜欢定点迭代。
希望这有帮助。