主要内容

参数化函数用于创建二维几何

需要语法

一个几何函数描述绑定几何区域的曲线。曲线是一个参数化函数(x(t),y(t))。的变量t范围在一个固定的时间间隔。为达到最佳效果,t必须与弧长加上一个常数成正比。

您必须指定至少两条曲线为每个几何区域。例如,“circleg”几何函数,它可以在偏微分方程工具箱™,使用四个曲线来描述一个圈。曲线只能相交的开始或者结束参数间隔。

工具箱函数查询你的几何函数通过0,1,或2参数。Conditionalize几何函数根据输入参数的数量返回这个表中描述的数据。

数量的输入参数 返回的数据
0(不= pdegeom) 在几何边的数量。
1(d = pdegeom (bs))

废话是一个向量的边缘部分。你的函数返回d作为每条边的矩阵的一列中指定废话。的行d是:

  1. 启动参数值

  2. 最终参数值

  3. 离开区域标签,“左”的方向从一开始到最后参数值

  4. 对区域标签

一个区域标签子域名数量是一样的。该地区的标签的外部几何0

2((x, y) = pdegeom (b s)) 年代电弧长度的数组,废话是一个标量或相同大小的数组年代让边上的数字。如果废话是一个标量,它适用于每一个元素年代。你的函数返回xy,这是xy边缘部分中指定的坐标废话在参数值年代。的xy数组具有相同的大小年代

参数化和区域标签之间的关系

下图显示了参数增加的方向与标签编号。图中的箭头的方向增加参数值。黑点表示曲线开始和结束点。红色数字显示区域标签。红0图表明,中心广场的中心是一个洞。

  • 曲线1和图2显示的箭头区域1左边区域0。

  • 由曲线箭头3和4显示区域0到左边,区域1到右边。

  • 曲线5和6的箭头显示区域0到左边,区域1到右边。

  • 由曲线箭头7和8显示区域1左边和区域0。

为一个圆几何函数

这个例子展示了如何编写一个几何函数创建一个圆形区域。用参数表示一个圆半径为1为中心在原点(0,0),如下所示:

x = 因为 ( t ) ,

y = ( t ) ,

0 t 2 π

一个几何函数必须至少有两个片段。为了满足这个需求,这个圆分解成四个部分。

  • 0 t π / 2

  • π / 2 t π

  • π t 3 π / 2

  • 3 π / 2 t 2 π

现在,您已经有了一个参数化,写几何函数。保存这个文件的函数circlefunction.m在你的MATLAB®路径。这个几何简单创建,因为参数化不改变根据段数。

函数(x, y) = circlefunction (b s) %创建一个单位圆集中在使用四段(0,0)。开关输入参数个数情况下0 x = 4;% 4边段返回案例1 =[0,π/ 2π3 *π/ 2;%开始参数值π/ 2,π,3 *π/ 2,2 *π;%最终参数值1,1,1,1;%区域标签左0,0,0,0);%区域标签对x = (:, bs);%返回要求列返回2 x = cos (s);y =罪(年代);结束

绘制几何图形显示数字和边缘面对标签。

pdegplot (@circlefunction“EdgeLabels”,“上”,“FaceLabels”,“上”)轴平等的

图包含一个坐标轴对象。坐标轴对象包含6行类型的对象,文本。

弧长计算几何函数

这个例子展示了如何创建一个心形几何使用四个不同的技术。用参数表示的技术方法你用弧长计算几何。心形满足方程 r = 2 ( 1 + 因为 ( Φ ) )

ezpolar (“2 * (1 + cos(φ))”)

以下是用参数表示的四个方法了弧长心形的函数:

  • 使用pdearcl函数与几何多边形近似。这种方法一般,足够准确和快速计算。

  • 使用积分fzero函数来计算弧长。这种方法计算代价高昂,但可以准确而不需要选择任意多边形。

  • 使用一个分析计算弧长。这种方法是最好的应用,但在许多情况下,它不适用。

  • 使用参数化不成比例的弧长+一个常数。这种方法是最简单的,但可以产生扭曲网格,不给你PDE问题最准确的解决方案。

多边形近似

有限元法使用三角形网格PDE数值近似的解决方案。你可以避免损失精度通过多边形近似几何足够好。的pdearcl函数之间的映射参数化和弧长形式适合一个几何函数。写以下几何函数心形。

函数(x, y) = cardioid1 (b s) % cardioid1几何文件定义的几何一个心形。
如果输入参数个数= = 0 x = 4;%四段边界返回结束
如果输入参数个数= = 1 dl =[0π/ 2π3 * 3π/ 2π/ 2π*π/ 2π2 * 1 1 1 1 0 0 0 0];x = dl (:, bs);返回结束
x = 0(大小(s));y = 0(大小(s));如果元素个数(bs) = = 1% bs可能需要标量扩张b = b *的(大小(s));%扩大bs结束
n = 400;%细多边形,每象限th = 100段linspace(0, 2 *π,n);%参数化r = 2 * (1 + cos (th));xt = r。* cos (th);%点插值弧长度次= r。*罪(th);%计算参数与弧长对应值s th = pdearcl (th, xt,欧美,年代,0,2 * pi);现在% th包含参数%计算x和y参数的th r = 2 * (1 + cos (th));x (:) = r。* cos (th);y (,) = r。* sin (th);结束

画出几何函数。

pdegplot (“cardioid1”,“EdgeLabels”,“上”)轴平等的

图包含一个坐标轴对象。坐标轴对象包含5线类型的对象,文本。

有400个线段,几何看起来光滑。

内置的cardg这种技术的函数给出了一个稍微不同的版本。

积分弧长

你可以写一个积分曲线的弧长。如果参数化的 x ( u ) y ( u ) ,弧长 年代 ( t )

年代 ( t ) = 0 t ( d x d u ) 2 + ( d y d u ) 2 d u

对于一个给定的值 年代 0 ,你可以找到 t 方程的根 年代 ( t ) = 年代 0 。的fzero解决这种类型的非线性函数方程。

写以下几何函数的心形的例子。

函数(x, y) = cardioid2 (b s) % cardioid2几何文件定义的几何一个心形。
如果输入参数个数= = 0 x = 4;%四段边界返回结束
如果输入参数个数= = 1 dl =[0π/ 2π3 * 3π/ 2π/ 2π*π/ 2π2 * 1 1 1 1 0 0 0 0];x = dl (:, bs);返回结束
x = 0(大小(s));y = 0(大小(s));如果元素个数(bs) = = 1% bs可能需要标量扩张b = b *的(大小(s));%扩大bs结束
哥伦比亚广播公司(cbs) =找到(b < 3);心形有趣= @ %上半部分(ss)积分(@ (t) sqrt (4 * (1 + cos (t))。^ 2 + 4 *罪(t) ^ 2), 0, ss);sscale =乐趣(pi);2 =哥伦比亚广播公司(:)' %确保一个行向量myfun = @ (rr)有趣(rr) - s (2) * sscale /π;θ= fzero (myfun[0,π]);r = 2 * (1 + cos(θ));x (ii) = r * cos(θ);y (ii) = r * sin(θ);结束哥伦比亚广播公司(cbs) =找到(b > = 3);%降低一半的心形(cbs) = 2 *π-年代(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”,“上”)轴平等的

图包含一个坐标轴对象。坐标轴对象包含5线类型的对象,文本。

几何图形看起来与多边形近似相同。需要更长的时间来计算这个积分版本比多边形的版本。

分析弧长

你也可以找到一个解析表达式的弧长参数化的函数。然后你可以给的弧长参数化。例如,找到一个解析的表达式通过使用符号数学工具箱™弧长。

信谊t真正的r = 2 * (1 + cos (t));x = r * cos (t);y = r * sin (t);arcl =简化(√diff (x) ^ 2 + diff (y) ^ 2));s = int (arcl t 0, t,“IgnoreAnalyticConstraints”,真正的)
s =

8 ( t 2 )

的弧长年代,参数tt = 2 *最佳(s / 8),在那里年代范围从0到8,对应t从0到 π 。为年代8和16之间,心形的对称性,t =π+ 2 *最佳((16 s) / 8)。此外,你可以表达xy而言,年代通过这些分析计算。

信谊年代真正的th = 2 *正如(s / 8);r = 2 * (1 + cos (th));r =扩大(右)
r =

4 - - - - - - 年代 2 16

x = r * cos (th);x =简化(扩大(x))
x =

年代 4 512年 - - - - - - 3 年代 2 16 + 4

y = r * sin (th);y =简化(扩大(y))
y =

年代 64年 - - - - - - 年代 2 3 / 2 512年

现在您已经解析表达式xy的弧长年代、写几何函数。

函数(x, y) = cardioid3 (b s) % cardioid3几何文件定义的几何一个心形。
如果输入参数个数= = 0 x = 4;%四段边界返回结束
如果输入参数个数= = 1 dl = [0 4 8 12 4 8 12 16 1 1 1 1 0 0 0 0];x = dl (:, bs);返回结束
x = 0(大小(s));y = 0(大小(s));如果元素个数(bs) = = 1% bs可能需要标量扩张b = b *的(大小(s));%扩大bs结束
哥伦比亚广播公司(cbs) =找到(b < 3);%的上半部分心形x (cbs) = (cbs)。^ * 4/512 - 3 s (cbs)。^ 2/16 + 4;y (cbs) = (cbs)。* (64 - s (cbs)。^ 2)。^ (3/2) / 512;哥伦比亚广播公司(cbs) =找到(b > = 3);%下半部分(cbs) = 16 -年代(cbs);%的反射x (cbs) = (cbs)。^ * 4/512 - 3 s (cbs)。^ 2/16 + 4;y (cbs) = - s (cbs)。* (64 - s (cbs)。^ 2)。^ (3/2) / 512;%否定y结束

情节显示标签边缘的几何函数。

pdegplot (“cardioid3”,“EdgeLabels”,“上”)轴平等的

图包含一个坐标轴对象。坐标轴对象包含5线类型的对象,文本。

这个解析几何看起来稍微比以前的版本更平稳。然而,不同的是无关紧要的计算。

几何不与电弧长度成正比

您也可以编写一个几何函数的参数不是成正比的弧长。这种方法可以产生扭曲的网格。

函数(x, y) = cardioid4 (b s) % cardioid4几何文件定义的几何一个心形。
如果输入参数个数= = 0 x = 4;%四段边界返回结束
如果输入参数个数= = 1 dl =[0π/ 2π3 * 3π/ 2π/ 2π*π/ 2π2 * 1 1 1 1 0 0 0 0];x = dl (:, bs);返回结束
r = 2 * (1 + cos (s));% s不是成正比的弧长x = r。* cos(年代);y = r。* sin(年代);结束

情节显示标签边缘的几何函数。

pdegplot (“cardioid4”,“EdgeLabels”,“上”)轴平等的

图包含一个坐标轴对象。坐标轴对象包含5线类型的对象,文本。

标签不均匀间隔的边缘,因为弧长参数不是成正比。

检查默认的网格的创建一个几何的四种方法。

次要情节(2 2 1)模型= createpde;geometryFromEdges(模型、@cardioid1);generateMesh(模型);pdeplot(模型)标题(“多边形”)轴平等的次要情节(2 2 2)模型= createpde;geometryFromEdges(模型、@cardioid2);generateMesh(模型);pdeplot(模型)标题(“积分”)轴平等的次要情节(2,2,3)模型= createpde;geometryFromEdges(模型、@cardioid3);generateMesh(模型);pdeplot(模型)标题(“分析”)轴平等的次要情节(2,2,4)模型= createpde;geometryFromEdges(模型、@cardioid4);generateMesh(模型);pdeplot(模型)标题(“扭曲”)轴平等的

图包含4轴对象。坐标轴对象1标题多边形包含2线类型的对象。坐标轴对象与标题2积分包含2线类型的对象。坐标轴对象3 2标题分析包含对象类型的线。坐标轴对象与标题扭曲4包含2线类型的对象。

扭曲的网格看起来有点比另一方更常规的网格。它有一些非常狭窄三角形心形的尖端附近。然而,所有的网格似乎是有用的。

几何函数示例子域和一个洞

这个例子展示了如何为一个地区创建一个几何图形文件子域和一个洞。它使用“分析弧长”部分的“弧长计算几何函数”的例子,一个变体圆函数从“一个圆的几何函数”。几何包含外部心形,分为上半部分称为子域1和下半部称为子域名2。此外,下半部分有一个圆孔集中在(1,1)和半径的1/2。下面是几何函数的代码。

函数(x, y) = cardg3 (b s) % cardg3几何文件定义以两个% %心脏线的几何条件和一个洞。如果输入参数个数= = 0 x = 9;% 9段返回结束如果输入参数个数= = 1%外心形dl =[0 4 8 12 4 8 12 16%地区1左边%的上半部分,2在1 1 2 2 0 0 0 0);%顶部和底部之间的分界线dl2 =[0 4 1%地区1左边2];%区域向右2 %内圆孔dl3 =[0π/ 2π3 * 3π/ 2π/ 2π*π/ 2 2π* 0 0 0 0%左空2 2 2 2];%区域向右2 %合并这三个优势矩阵dl = (dl, dl2, dl3);x = dl (:, bs);结束返回x = 0(大小(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”,“上”)轴平等的

图包含一个坐标轴对象。坐标轴对象包含12线类型的对象,文本。

嵌套函数几何与额外的参数

这个例子展示了如何包含额外的参数到一个函数创建一个二维几何。

二维几何函数需要额外的参数时,您不能使用一个标准的匿名函数方法,因为几何函数返回一个不同数量的参数。相反,您可以使用全局变量或嵌套的函数。在大多数情况下,推荐的方法是使用嵌套的函数。

这个例子解决了泊松方程零狄利克雷边界条件在所有界限。几何图形是一个心形的椭圆孔中心semiaxes(1,1)和变量。建立和解决这种几何的PDE模型,使用嵌套的函数。在这里,父函数接受semiaxes的长度,rr党卫军作为输入参数。巢的理由cardioidWithEllipseGeomcardioidWithEllipseModel是嵌套函数分担父母的工作空间函数。因此,cardioidWithEllipseGeom函数可以访问的值rr党卫军你通过cardioidWithEllipseModel

函数cardioidWithEllipseModel (rr, ss)
如果(rr > 0) & (ss > 0)模型= createpde ();geometryFromEdges(模型、@cardioidWithEllipseGeom);pdegplot(模型、“EdgeLabels”、“上”,“FaceLabels”,“上”)轴相等
applyBoundaryCondition(模型、“狄利克雷”、“边缘”,1:8," u ", 0);specifyCoefficients(模型,“m”, 0,“d”, 0,“c”, 1,“”, 0, " f ", 1);
generateMesh(模型);u = solvepde(模型);图pdeplot(模型、“XYData u.NodalSolution)轴相等
其他显示(“Semiaxes值必须是正数。”)
函数(x, y) = cardioidWithEllipseGeom (b s)
如果输入参数个数= = 0 x = 8;% 8段边界返回结束
如果输入参数个数= = 1%心形dlc = [0 4 8 12 4 8 12 16 1 1 1 1 0 0 0 0];%椭圆dle =[0π/ 2π3 * 3π/ 2π/ 2π* 2π/ 2 *π0 0 0 0 1 1 1 1);%将边缘矩阵dl = (dlc, dle);x = dl (:, bs);返回结束
x = 0(大小(s));y = 0(大小(s));如果元素个数(bs) = = 1% bs需要标量扩张吗?b = b *的(大小(s));%扩大bs结束
哥伦比亚广播公司(cbs) =找到(b < 3);%的上半部分心形x (cbs) = (cbs)。^ * 4/512 - 3 s (cbs)。^ 2/16 + 4;y (cbs) = (cbs)。* (64 - s (cbs)。^ 2)。^ (3/2) / 512;哥伦比亚广播公司(cbs) =找到(b > = 3 & b < = 4);%降低一半的心形(cbs) = 16 -年代(cbs);x (cbs) = (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,确保semiaxes值足够小,以便椭圆孔似乎完全在外面的心形。否则,几何就变成无效的了。

例如,调用该函数为主要的半轴的椭圆rr = 0.5和小的半轴党卫军= 0.25。这个函数调用返回以下几何和解决方案。

cardioidWithEllipseModel (0.5, 0.25)

图包含一个坐标轴对象。坐标轴对象包含10线类型的对象,文本。

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象的补丁。