二维几何创建的参数化函数
需要语法
几何函数描述约束几何区域的曲线。曲线是参数化函数(x(t),y(t)).的变量t固定间隔的范围。为了达到最佳效果,t一定正比于弧长加上一个常数。
必须为每个几何区域指定至少两条曲线。例如,“circleg”
几何函数,可在偏微分方程工具箱™,使用四条曲线来描述一个圆。曲线只能在参数区间的开始或结束处相交。
工具箱函数通过传入0、1或2个参数来查询几何函数。根据输入参数的数量对几何函数进行条件化,以返回本表中描述的数据。
输入参数的数量 | 返回的数据 |
---|---|
0 (Ne = pdegeom ) |
不 几何图形中的边数。 |
1 (D = pdegeom(bs) ) |
区域标签与子域号相同。几何图形外部的区域标签为 |
2 ([x,y] = pdegeom(bs,s) ) |
年代 是弧长数组,和废话 标量或数组的大小是否相同年代 这就给出了边数。如果废话 是标量,那么它适用于里面的每一个元素年代 .函数返回x 而且y ,即x 而且y 中指定的边缘段的坐标废话 在参数值处年代 .的x 而且y 数组的大小与年代 . |
参数化与区域标签的关系
参数增加方向与标签编号的关系如下图所示。图中箭头表示参数值的递增方向。黑点表示曲线的起点和终点。红色数字表示区域标签。图中中间的红色0表示中间方形为孔。
曲线1和曲线2的箭头向左表示区域1,向右表示区域0。
曲线3和曲线4的箭头向左表示区域0,向右表示区域1。
曲线5和曲线6对应的箭头向左表示区域0,向右表示区域1。
曲线7和曲线8对应的箭头向左表示区域1,向右表示区域0。
圆的几何函数
这个例子展示了如何编写一个几何函数来创建一个圆形区域。参数化一个以原点为中心,半径为1的圆(0,0)
,详情如下:
一个几何函数必须至少有两个段。为了满足这个要求,将圆分成四个部分。
现在你有一个参数化,写几何函数。保存此函数文件为circlefunction.m
在MATLAB®路径上。这个几何图形创建起来很简单,因为参数化不依赖于段数而改变。
function [x,y] = circlefunction(bs,s) %用四个段创建一个以(0,0)为中心的单位圆。开关narkin case 0 x = 4;%四个边段返回case 1 A = [0,pi/2,pi,3*pi/2;%开始参数值pi/2,pi,3*pi/2,2*pi;%结束参数值1,1,1,1;%区域标签左0,0,0,0];%区域标签到右侧x = A(:,bs);%返回所请求的列返回case 2 x = cos(s);Y = sin(s);结束
绘制显示边号和面标签的几何图形。
pdegplot (@circlefunction“EdgeLabels”,“上”,“FaceLabels”,“上”)轴平等的
几何函数的弧长计算
这个例子展示了如何使用四种不同的技术创建一个心线几何图形。这些技术是使用弧长计算将几何参数化的方法。心线满足方程 .
ezpolar (“2 * (1 + cos(φ))”)
下面是四种参数化心形线作为弧长函数的方法:
多边形近似
有限元法采用三角形网格对偏微分方程进行数值逼近。可以通过对几何进行足够精细的多边形近似来避免精度损失。的pdearcl
函数映射参数化和弧长之间的形式很适合几何函数。为心脏线写下面的几何函数。
function [x,y] = cardioid1(bs,s) % cardioid1定义心脏线几何形状的几何文件。
如果nargin == 0 x = 4;% 4段在边界返回端
如果nargin == 1 dl = [0 pi/2 pi 3*pi/2 pi/2 pi 3*pi/2 2*pi 1 1 1 0 0 0 0 0];X = dl(:,bs);返回结束
X = 0(大小(s));Y = 0(大小(s));如果数值(bs) == 1%, bs可能需要标量展开bs = bs*ones(size(s));% expand bs结束
NTH = 400;%细多边形,每象限100段= linspace(0,2*pi,n);%参数化r = 2*(1 + cos(th));Xt = r.*cos(th);%弧长yt = r.*sin(th)插值点;%计算s中弧长值对应的参数th = pdearcl(th,[xt;yt],s,0,2*pi);% th包含参数%现在计算参数th的x和y r = 2*(1 + cos(th));X (:) = r.*cos(th);Y (:) = r.*sin(th);结束
画出几何函数。
pdegplot (“cardioid1”,“EdgeLabels”,“上”)轴平等的
有400条线段,几何体看起来很平滑。
内置的cardg
Function提供了这种技术的一个稍微不同的版本。
弧长积分
你可以写出一条曲线的弧长积分。如果参数化是 而且 ,则弧长 是
对于给定的值
,你可以找到
作为方程的根
.的fzero
函数解这类非线性方程。
为心脏线示例编写以下几何函数。
function [x,y] = cardioid2(bs,s) % cardioid2定义心脏线几何形状的几何文件。
如果nargin == 0 x = 4;% 4段在边界返回端
如果nargin == 1 dl = [0 pi/2 pi 3*pi/2 pi/2 pi 3*pi/2 2*pi 1 1 1 0 0 0 0 0];X = dl(:,bs);返回结束
X = 0(大小(s));Y = 0(大小(s));如果数值(bs) == 1%, bs可能需要标量展开bs = bs*ones(size(s));% expand bs结束
CBS = find(bs < 3);@(ss)积分(@(t)根号下(4*(1 + cos(t))。^2 + 4* sint ^2,0,ss);Sscale = fun(pi);对于ii = cbs(:)' %确保行向量myfun = @(rr)fun(rr)-s(ii)*sscale/pi;Theta = f0 (myfun,[0,pi]);R = 2*(1 + cos());X (ii) = r*cos(theta);Y (ii) = r*sin(theta);结束CBS = find(bs >= 3);%心线s下半部分(cbs) = 2*pi - s(cbs); for ii = cbs(:)' theta = fzero(@(rr)fun(rr)-s(ii)*sscale/pi,[0,pi]); r = 2*(1 + cos(theta)); x(ii) = r*cos(theta); y(ii) = -r*sin(theta); end end
绘制显示边缘标签的几何函数。
pdegplot (“cardioid2”,“EdgeLabels”,“上”)轴平等的
几何形状看起来与多边形近似相同。这个积分版本的计算时间比多边形版本长得多。
解析弧长
你也可以找到弧长作为参数化函数的解析表达式。然后你可以用弧长给出参数化。例如,使用Symbolic Math Toolbox™找到弧长的解析表达式。
信谊t真正的R = 2*(1+cos(t));X = r*cos(t);Y = r* sint;Arcl = simplify(√(diff(x)^2+diff(y)^2));S = int(arcl,t,0,t,“IgnoreAnalyticConstraints”,真正的)
s =
就弧长而言年代
,参数t
是T = 2*asin(s/8)
,在那里年代
取值范围为0 ~ 8,对应t
范围从0到
.为年代
在8到16岁之间,由于心脏对称,T = PI + 2*asin((16-s)/8)
.此外,你可以表达x
而且y
在这方面年代
通过这些分析计算。
信谊年代真正的Th = 2*asin(s/8);R = 2*(1 + cos(th));R =扩展(R)
r =
X = r*cos(th);X =简化(展开(X))
x =
Y = r*sin(th);Y =简化(展开(Y))
y =
现在你有了解析式x
而且y
就弧长而言年代
,写出几何函数。
function [x,y] = cardioid3(bs,s) % cardioid3定义心脏线几何形状的几何文件。
如果nargin == 0 x = 4;% 4段在边界返回端
如果nargin == 1 dl = [0 4 8 12 4 8 12 16 1 1 1 0 0 0 0];X = dl(:,bs);返回结束
X = 0(大小(s));Y = 0(大小(s));如果数值(bs) == 1%, bs可能需要标量展开bs = bs*ones(size(s));% expand bs结束
CBS = find(bs < 3);%心廓x(cbs) = s(cbs)。^4/512 - 3*s(cbs)。^2/16 + 4;Y (cbs) = s(cbs)。*(64 - s(cbs).^2).^(3/2)/512;CBS = find(bs >= 3);%下半部分s(cbs) = 16 - s(cbs);%取反射x(cbs) = s(cbs)。^4/512 - 3*s(cbs)。^2/16 + 4;Y (cbs) = -s(cbs)。*(64 - s(cbs).^2).^(3/2)/512;%负y结束
绘制显示边缘标签的几何函数。
pdegplot (“cardioid3”,“EdgeLabels”,“上”)轴平等的
这个解析几何看起来比以前的版本稍微平滑一些。然而,这种差异在计算上是无关紧要的。
几何形状与弧长不成比例
你也可以写一个几何函数,其中参数与弧长不成比例。这种方法可以产生扭曲的网格。
function [x,y] = cardioid4(bs,s) % cardioid4定义心脏线几何形状的几何文件。
如果nargin == 0 x = 4;% 4段在边界返回端
如果nargin == 1 dl = [0 pi/2 pi 3*pi/2 pi/2 pi 3*pi/2 2*pi 1 1 1 0 0 0 0 0];X = dl(:,bs);返回结束
R = 2*(1 + cos(s));% s与弧长x = r不成正比*cos(s);Y = r.*sin(s);结束
绘制显示边缘标签的几何函数。
pdegplot (“cardioid4”,“EdgeLabels”,“上”)轴平等的
由于参数与弧长不成比例,标签在边缘上的间距不是均匀的。
检查创建几何图形的四种方法中的每一种的默认网格。
Subplot (2,2,1) model = createpde;geometryFromEdges(模型、@cardioid1);generateMesh(模型);pdeplot(模型)标题(“多边形”)轴平等的Subplot (2,2,2) model = createpde;geometryFromEdges(模型、@cardioid2);generateMesh(模型);pdeplot(模型)标题(“积分”)轴平等的Subplot (2,2,3) model = createpde;geometryFromEdges(模型、@cardioid3);generateMesh(模型);pdeplot(模型)标题(“分析”)轴平等的Subplot (2,2,4) model = createpde;geometryFromEdges(模型、@cardioid4);generateMesh(模型);pdeplot(模型)标题(“扭曲”)轴平等的
扭曲的网格看起来比其他网格不那么规则。它在心线尖端附近有一些很窄的三角形。尽管如此,所有的网格似乎都是可用的。
带有子域和洞的几何函数实例
此示例演示如何为具有子域和洞的区域创建几何文件。它使用了“几何函数的弧长计算”示例中的“解析弧长”部分和“圆的几何函数”中的圆函数的变体。该几何结构由一个外心线组成,它分为称为子域1的上半部分和称为子域2的下半部分。同样,下半部分有一个圆心为(1,-1),半径为1/2的圆孔。下面是几何函数的代码。
function [x,y] = cardg3(bs,s) % cardg3 Geometry文件,定义一个心脏线的%几何,包含两个%子区域和一个孔。如果nargin == 0 x = 9;% 9段返回结束if nargin == 1%外心线dl =[0 4 8 12 4 8 12 16 %区域1左在%上半部分,2在1 12 2 0 0 0 0];%上下分割线dl2 =[0 4 1 %区域1向左2];%区域2向右%内圆孔dl3 = [0 pi/2 pi 3*pi/2 pi/2 pi 3*pi/2 2*pi 0 0 0 0%左侧空2 2 2 2 2 2];将三个边矩阵dl = [dl,dl2,dl3];X = dl(:,bs);返回x = 0 (size(s));Y = 0(大小(s));如果数字(bs) == 1% bs是否需要标量展开? bs = bs*ones(size(s)); % Expand bs end cbs = find(bs < 3); % Upper half of cardioid x(cbs) = s(cbs).^4/512 - 3*s(cbs).^2/16 + 4; y(cbs) = s(cbs).*(64 - s(cbs).^2).^(3/2)/512; cbs = find(bs >= 3 & bs <= 4); % Lower half of cardioid s(cbs) = 16 - s(cbs); x(cbs) = s(cbs).^4/512 - 3*s(cbs).^2/16 + 4; y(cbs) = -s(cbs).*(64 - s(cbs).^2).^(3/2)/512; cbs = find(bs == 5); % Index of straight line x(cbs) = s(cbs); y(cbs) = zeros(size(cbs)); cbs = find(bs > 5); % Inner circle radius 0.25 center (1,-1) x(cbs) = 1 + 0.25*cos(s(cbs)); y(cbs) = -1 + 0.25*sin(s(cbs)); end
绘制几何图形,包括边缘标签和子域标签。
pdegplot (@cardg3“EdgeLabels”,“上”,...“FaceLabels”,“上”)轴平等的
附加参数的几何嵌套函数
这个例子展示了如何在一个函数中包含额外的参数来创建一个2-D几何图形。
当2-D几何函数需要附加参数时,不能使用标准的匿名函数方法,因为几何函数返回不同数量的参数。相反,您可以使用全局变量或嵌套函数。在大多数情况下,推荐的方法是使用嵌套函数。
该例子求解了一个在所有边界上均为零狄利克雷边界条件的泊松方程。该几何图形是一个心形线,带有一个椭圆孔,其中心位于(1,-1)和可变半轴。要使用该几何图形设置和求解PDE模型,请使用一个嵌套函数。这里,父函数接受半轴的长度,rr
而且党卫军
,作为输入参数。筑巢的原因cardioidWithEllipseGeom
在cardioidWithEllipseModel
嵌套函数共享其父函数的工作空间。因此,cardioidWithEllipseGeom
函数的值rr
而且党卫军
你传递给cardioidWithEllipseModel
.
函数cardioidWithEllipseModel (rr, ss)
If (rr > 0) & (ss > 0) model = createpde();geometryFromEdges(模型、@cardioidWithEllipseGeom);pdegplot(模型,"EdgeLabels","on","FaceLabels","on")轴相等
applyBoundaryCondition(模型、“狄利克雷”、“边缘”,1:8," u ", 0);specifyCoefficients(模型,“m”,0,“d”,0,“c”,1,“”,0," f ", 1);
generateMesh(模型);U = solvepde(模型);图pdeploy (model,"XYData",u.NodalSolution
否则显示(“半轴值必须为正数。”)结束
function [x,y] = cardioidWithEllipseGeom(bs,s)
如果nargin == 0 x = 8;% 8段在边界返回端
if nargin == 1%心线dlc = [0 4 8 12 4 8 12 16 1 1 1 0 0 0 0 0];%椭圆= [0 pi/2 pi 3*pi/2 pi/2 pi 3*pi/2 2*pi 0 0 0 0 1 1 1 1];%合并边缘矩阵dl = [dlc,dle];X = dl(:,bs);返回结束
X = 0(大小(s));Y = 0(大小(s));如果数字(bs) == 1% bs是否需要标量展开?Bs = Bs *ones(size(s));% Expand bs结束
CBS = find(bs < 3);%心廓x(cbs) = s(cbs)。^4/512 - 3*s(cbs)。^2/16 + 4;Y (cbs) = s(cbs)。*(64 - s(cbs).^2).^(3/2)/512;CBS = find(bs >= 3 & bs <= 4);%心线s(cbs)下半部分= 16 - s(cbs);X (cbs) = s(cbs)。^4/512 - 3*s(cbs)。^2/16 + 4;Y (cbs) = -s(cbs)。*(64 - s(cbs).^2).^(3/2)/512; cbs = find(bs > 4); % Inner ellipse center (1,-1) axes rr and ss x(cbs) = 1 + rr*cos(s(cbs)); y(cbs) = -1 + ss*sin(s(cbs));
结束
结束
当调用cardioidWithEllipseModel
,确保半轴值足够小,使椭圆孔完全出现在外心线内。否则,几何图形将无效。
例如,调用带有主半轴的椭圆的函数Rr = 0.5
还有小半轴Ss = 0.25
.该函数调用返回以下几何图形和解。
cardioidWithEllipseModel (0.5, 0.25)