主要内容

用配点法求解带边界层的非线性常微分方程

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

问题

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

epsilon d ^ 2g(x)+(g(x))^ 2 = 1 on [0..1]

dg(0)= g(1)= 0。

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

epsilon = .1;

近似空间

我们通过从C ^ 1分段型的搭配寻求近似解决方案,具有指定的中断序列休息,因此想要订单K.四岁。

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

我们获得了相应的结序列

结=奥克斯(休息,K,2)
结=1×14.0 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 = TEMP(:)。';

数值问题

我们想要解决的数值问题是找到分段多项式(或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):=epsilon,w_1(x):=0表示colsites中的x

并选择所有其他值W_0.W_1.W_2.,及B.尚未指定为零,我们可以给我们的系统均匀的形状

w_0(x)z(x)z(x)+ w_1(x)dz(x)+ w_2(x)d ^ 2z(x)= b(x)在站点中的x

在哪里

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

线性系统要解决

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

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

Spcol B样条搭配矩阵。

colloc = spcol(结,k,tau)是矩阵

[D ^ M(i)b_j(tau(i)):i = 1:长度(tau),j = 1:长度(结)-k],

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

b_j为结序列结的订单k的第j个b样条曲线,

TAU是一系列的站点,

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

m(i)是整数#{j

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

我们用sp提供矩阵

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

BRK2KNT.这里使用的每次进入遗址,因此我们进入了科尔马,每个人X遗址,价值和第一和第二衍生物X所有相关的B样条。

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

需要对Y进行初步猜测吗

我们还需要当前近似值y从我们的花键空间。最初,我们通过从我们的PP空间内插入一些合理的初始猜测来获得它遗址。对于那种猜测,我们使用抛物线

x^2-1

这确实满足了最终条件,并且在我们的花键空间中呈现。我们通过插值获得其B形式遗址。我们从完整矩阵中选择相关的插值矩阵科尔马. 以下是几个谨慎的步骤:

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)''地点'“西北”);轴([ -  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));fprintf('maxdif =%g \ n',maxdif)如果(maxdif 休息那结尾%现在重申y = z;结尾
maxdif=0.206695 maxdif=0.01207 maxdif=3.95151e-05 maxdif=4.43216e-10
传奇({'初始猜测(x ^ 2-1)''迭代'},'地点'“西北”);

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

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

为较小的epsilon做好准备

如果我们现在减少埃斯利昂,我们在右端点附近创建更多的边界层,并且此呼叫不均匀的网格。我们用纽knt.从当前近似构造合适的(更精细)网格。

节数=新的KNT(z,n节数+1);断裂=knt2brk(节);结=俄歇(断裂,4,2);n=长度(节)-k;

新休息的搭配网站

接下来,我们得到了与新的搭配网站休息

ninterv=长度(断开)-1;温度=((中断(2:ninterv+1)+中断(1:ninterv))/2);温度=温度([11],:)+gauss*diff(间断);colsites=temp(:)';站点=[0,colsites,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=gca;h=ax.儿童;图例(h([6 5 1]){'初始猜测(x ^ 2-1)''迭代'......'epsilon新价值的新初步猜测'},......'地点'“西北”);

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

用较小的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));fprintf('maxdif =%g \ n',maxdif)如果(maxdif 休息那结尾%现在重申y = z;结尾
maxdif=0.237937 maxdif=0.0184488 maxdif=0.000120467 maxdif=4.78115e-09
斧头= GCA;h = ax.children;传说(h([10 9 5 4]),......{'epsilon = .1'的初始猜测(x ^ 2-1)'迭代'......Sprintf('初步猜测epsilon =%.3f',epsilon)......'迭代'},'地点'“西北”);

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

非常小的epsilon.

一个更小的埃斯利昂,我们只是重复这些计算,除以埃斯利昂每次三点。

为了ee = 1:4结= Newknt(z,ninterv + 1);休息= knt2brk(结);结=奥克纳(休息,4,2);n =长度(结)-k;ninterv=长度(断开)-1;温度=((中断(2:ninterv+1)+中断(1:ninterv))/2);温度=温度([11],:)+gauss*diff(间断);colsites=temp(:)';站点=[0,colsites,1];Colmat = Spcol(Knots,K,Brk2knt(网站,3));intmat = colmat([2 1+(1:(n-2))* 3,1+(n-1)* 3],:);y = spmak(结,[0 fnval(z,colsites)0] / intmat。');fnplt(y,'C')ε=ε/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;结尾结尾斧头= GCA;h = ax.children;传奇(h([30 29 25 24]),......{'epsilon = .1'的初始猜测(x ^ 2-1)'迭代'......'epsilon的初始猜测= .1 / 3 ^ j,j = 1:5'......'迭代'},'地点'“西北”);

图包含轴。轴包含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; NaN],1,长度(断裂));绘图(BB(:),CC(:),'r');抓住离开斧头= GCA;h = ax.children;图例(h([31 30 26 25 1]),......{'epsilon = .1'的初始猜测(x ^ 2-1)'迭代'......'epsilon的初始猜测= .1 / 3 ^ j,j = 1:5'......'迭代''epsilon的休息= .1 / 3 ^ 5'},'地点'“西北”);

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

绘制最小ε的残差

回想一下,我们正在解决颂歌

epsilon d ^ 2g(x)+(g(x))^ 2 = 1 on [0..1]

作为检查,我们计算并绘制计算解决方案的残差为最小的epsilon。这也看起来令人满意。

xx = linspace(0,1,201);绘图(XX,1  -  epsilon * fnval(fnder(z,2),xx) - (fnval(z,xx))。^ 2)标题('对于最小的epsilon的计算解决方案'的剩余物);

图包含轴。用于最小ε的计算解决方案的标题残差的轴包含类型线的物体。