主要内容

通过搭配用边界层求解非线性ode

此示例显示如何使用曲线拟合工具箱™解决非线性常微分方程(ODE)的样条命令。

这个问题

我们考虑非线性奇异扰动的问题

在[0..1]上D^2g(x) + (g(x))^2 = 1

Dg(0) = g(1) = 0。

这个问题已经很难epsilon = .001,所以我们选择一个谦虚

epsilon = .1;

近似空间

我们用C^1分段三次函数的配点法求得一个具有指定中断序列的近似解休息时间,于是想要秩序K.是4。

休息=(0:4)/ 4;k = 4;

我们获得了相应的结序列

节= augknt(休息,k, 2)
结=1×140 0 0 0 0.2500 0.2500 0.5000 0.5000 0.7500 0.7500 1.0000 1.0000 1.0000 1.0000

无论订单和结所选择,相应的花键空间都有尺寸

N =长度(节)- k
n = 10.

离散化

自由度的数量,10,很好地符合了我们期望在8个条件下,每个多项式块在两个位置上配置的事实,一旦我们把两个边条件加起来,就得到了10个条件。

我们为每个间隔选择两个高斯站点。对于单位长度的“标准”间隔[-1/2 .1 / 2],这些是两个站点

高斯= .5773502692 * [ -  1/2;1/2];

由此,我们获得了整个搭配网站的集合

ninterv =长度(减免)1;temp =(优惠(2:ninterv + 1) +优惠(1:ninterv)) / 2;Temp = Temp ([1 1],:) + gauss*diff(breaks); / /去掉所有的空colsites =临时(:)。';

数值问题

我们要解决的数值问题是找到一个分段多项式(或PP.y给定的顺序,并且具有满足非线性系统的给定结

DY(0)= 0

(y(x))^ 2 + epsilon d ^ 2y(x)= 1在咖喱中的x

Y(1)= 0

线性化

如果y是我们目前的近似解,那么这个线性问题的更好的(?)解Z.根据牛顿的方法

DZ(0)= 0

w_0(x)z(x)+ epsilon d ^ 2z(x)= b(x)在咖喱中的x

z(1)= 0

w_0(x):= 2y(x)B(x):=(y(x))^ 2 + 1

事实上,通过选择w_0(1):= 1w_1(0):= 1, 和

W_2 (x):=, w_1(x):= 0

并选择所有其他值W_0.W_1.W_2., 和B.还没有指定为零,我们可以给我们的系统一个统一的形状

w_0 (x) z (x) + w_1 (x) Dz (x) + w_2 (x) ^ 2 z D b (x) = x (x)的网站

在哪里

站点= [0,辣静,1];

线性系统要解决

该系统转换为其解决方案的B样条系数一个Z..为此,我们需要每一个Zeroth和第二个衍生X遗址以及每个相关的B样条。这些值由该值提供sp命令。

这是文档的重要组成部分sp

SPCOL b样条配置矩阵。

COLLOC = SPCOL(KNOTS,K,TAU)为矩阵

[D ^ m (i) B_j(τ(i)): i = 1:长度(τ),j = 1:长度(节)- k),

用d ^ m(i)b_j的m(i) - b_j的衍生物,

B_j结点序列的第j条b样条的K阶

Tau一系列网站,

假设结和tau都被认为是nondecreaping,而且

m(i)是整数#{j

TAU(i)的“累积”多重性。

我们使用sp提供矩阵

Colmat = Spcol(Knots,K,Brk2knt(网站,3));

BRK2KNT.在这里将每个条目三倍遗址,因此我们进入了colmat,对于每一个X遗址,点处的一阶导数和二阶导数X所有相关的B样条。

由此,我们通过组合与关联的行三重命运来获得搭配矩阵X使用权重w_0 (x) w_1 (x) w_2 (x)得到相对应的行X线性方程组的矩阵。

需要初步猜测

我们还需要一个电流近似y从样条空间。首先,我们从pp空间中插值一些合理的初始猜想得到遗址.我们用抛物线来猜测

x ^ 2 - 1

它满足结束条件并且位于样条空间。我们通过插值得到它的b型遗址.我们从全矩阵中选取相应的插值矩阵colmat.在这里,在几个谨慎的步骤:

Intmat = colmat([2 1+(1:(n-2))*3,1+(n-1)*3],:);cofs = intmat \ [0 colsites。* colsites-1 0]。';y = spmak(结,cofs。');

我们绘制结果,肯定 - 它应该是完全的x ^ 2-1

fnplt (y,‘g’);传奇(“初始猜测(x ^ 2 - 1)”“位置”'nw');轴([ -  0.01 1.01 -1.01 0.01]);抓住

图中包含一个轴对象。轴对象包含类型线的对象。此对象表示初始猜测(x ^ 2-1)。

迭代

我们现在可以完成线性系统的构造和求解,得到改进的近似解Z.从我们目前的猜测y.事实上,根据最初的猜测y可用,我们现在设置迭代,在变更时终止Z-Y.低于指定的公差。

公差= 6.e-9;

变化的最大规范Z-Y.在每次迭代都显示为下面的输出,图显示了每个迭代。

尽管1 vtau = fnval(y,colsites);重量= [0 1 0;[2 * vtau。'零(n-2,1)Repmat(epsilon,n-2,1)];1 0 0];colloc = zeros(n,n);为了j = 1:n colloc(j,:) =权重(j,:) * colmat(3 *(J-1)+(1:3),:);结束cofs = colloc \ [0 vtau。* vtau + 1 0]。';z = spmak(结,cofs。');fnplt(z,“k”);maxdif = max (max (abs (z.coefs-y.coefs)));流(“maxdif = % g \ n”,maxdif)如果(maxdif 打破那结束%现在重申y = z;结束
MAXDIF = 0.206695 MAXDIF = 0.01207 MAXDIF = 3.95151E-05 MAXDIF = 4.43216E-10
传奇({“初始猜测(x ^ 2 - 1)”'迭代'},“位置”'nw');

图中包含一个轴对象。轴对象包含5个类型的类型。这些对象代表初始猜测(x ^ 2-1)迭代。

从牛顿迭代预期的那样看起来像二次收敛。

为更小的做好准备

如果我们现在减少ε,我们在右端点附近创建更多的边界层,这需要一个非均匀网格。我们使用纽knt.从当前近似构造合适的(更精细)网格。

结= newknt(z,ninterv + 1);休息= knt2brk(节);节= augknt(休息,4,2);n =长度(节)- k;

新突破的搭配地点

接下来,我们得到与new对应的并置点休息时间

ninterv =长度(减免)1;temp =((优惠(2:ninterv + 1) +优惠(1:ninterv)) / 2);Temp = Temp ([1 1],:) + gauss*diff(breaks); / /去掉所有的空colsites =临时(:)。';站点= [0,辣静,1];

然后是新的搭配矩阵。

Colmat = Spcol(Knots,K,Brk2knt(网站,3));

初步猜测

我们获得了最初的猜测y作为从当前样条空间到计算解决方案的插值Z..我们绘制了结果的跨节才能确定 - 它应该接近我们当前的解决方案。

Intmat = colmat([2 1+(1:(n-2))*3,1+(n-1)*3],:);Y = spmak(结点,[0 fnval(z,colsites) 0]/intmat.');fnplt (y,'C');甘氨胆酸ax =;h = ax.Children;传奇(H([6 5 1]),{“初始猜测(x ^ 2 - 1)”'迭代'......对新的值的新的初始猜测},......“位置”'nw');

图中包含一个轴对象。轴对象包含6个类型的线路。这些对象代表初始猜测(x ^ 2-1),迭代,新的初始猜测epsilon的新值。

较小的迭代

现在我们分裂了ε3×3并重复上述迭代。融合再次二次。

epsilon = epsilon / 3;尽管1 vtau = fnval(y,colsites);重量= [0 1 0;[2 * vtau。'零(n-2,1)Repmat(epsilon,n-2,1)];1 0 0];colloc = zeros(n,n);为了j = 1:n colloc(j,:) =权重(j,:) * colmat(3 *(J-1)+(1:3),:);结束cofs = colloc \ [0 vtau。* vtau + 1 0]。';z = spmak(结,cofs。');fnplt(z,'B');maxdif = max (max (abs (z.coefs-y.coefs)));流(“maxdif = % g \ n”,maxdif)如果(maxdif 打破那结束%现在重申y = z;结束
MAXDIF = 0.237937 MAXDIF = 0.0184488 MAXDIF = 0.000120467 MAXDIF = 4.78115E-09
甘氨胆酸ax =;h = ax.Children;图例(h([10 9 5 4]),......{'epsilon = .1'的初始猜测(x ^ 2-1)'迭代'......sprintf ('初步猜测epsilon =%.3f',epsilon)......'迭代'},“位置”'nw');

图中包含一个轴对象。轴对象包含10个类型的类型。这些对象代表epsilon = .1的初始猜测(x ^ 2-1),迭代,epsilon的初始猜测= 0.033。

非常小的ε

一个小得多的ε,我们只是重复这些计算,除法ε每次3到3。

为了e = 1:4节= newknt(z, ninterv+1);休息= knt2brk(节);节= augknt(休息,4,2);n =长度(节)- k;ninterv =长度(减免)1;temp =((优惠(2:ninterv + 1) +优惠(1:ninterv)) / 2);Temp = Temp ([1 1],:) + gauss*diff(breaks); / /去掉所有的空colsites =临时(:)。';colsites网站= [0,1];Colmat = spcol(结点,k, brk2knt(sites,3)); intmat = colmat([2 1+(1:(n-2))*3,1+(n-1)*3],:); y = spmak(knots,[0 fnval(z,colsites) 0]/intmat.'); fnplt(y,'C')epsilon = epsilon / 3;尽管1 vtau = fnval(y,colsites);重量= [0 1 0;[2 * vtau。'零(n-2,1)Repmat(epsilon,n-2,1)];1 0 0];colloc = zeros(n,n);为了j = 1:n colloc(j,:) =权重(j,:) * colmat(3 *(J-1)+(1:3),:);结束cofs = colloc \ [0 vtau。* vtau + 1 0]。';z = spmak(结,cofs。');fnplt(z,'B');maxdif = max (max (abs (z.coefs-y.coefs)));如果(maxdif 打破那结束%现在重申y = z;结束结束甘氨胆酸ax =;h = ax.Children;传奇(h([30 29 25 24]),......{'epsilon = .1'的初始猜测(x ^ 2-1)'迭代'......' = .1/3^j, j=1:5的初始猜测'......'迭代'},“位置”'nw');

图中包含一个轴对象。轴对象包含30个类型的类型。这些对象代表epsilon = .1的初始猜测(x ^ 2-1),迭代,epsilon的初始猜测= .1 / 3 ^ j,j = 1:5。

绘制用于最小ε的休息

这是最终分布休息时间,显示纽knt.在这种情况下工作得很好。

breaks = fnbrk(fn2fm(z,'pp'),'B');bb = repmat(休息,3,1);cc = repmat([0, 1,南],1,长度(休息);情节(bb (:), cc (:),'r');抓住甘氨胆酸ax =;h = ax.Children;图例(h([31 30 26 25 1]),......{'epsilon = .1'的初始猜测(x ^ 2-1)'迭代'......' = .1/3^j, j=1:5的初始猜测'......'迭代''epsilon的休息= .1 / 3 ^ 5'},“位置”'nw');

图中包含一个轴对象。axis对象包含31个类型为line的对象。这些对象表示= .1的初始猜测(x^2-1), Iterates, = .1/3^j的初始猜测,j=1:5, Breaks = .1/3^5。

绘制最小ε的残差

回想一下,我们在解ODE

在[0..1]上D^2g(x) + (g(x))^2 = 1

作为检验,我们计算并绘制出最小的的计算解的残差。这看起来也令人满意。

xx = linspace (0, 1201);*fnval(fnder(z,2),xx) - (fnval(z,xx)).^2)'对于最小的epsilon的计算解决方案'的剩余物);

图中包含一个轴对象。具有标题残差的轴对象对于最小的epsilon的计算解决方案包含了类型线的对象。