主要内容

解决非线性ODE边界层的搭配

这个例子展示了如何使用样条命令从曲线拟合工具箱™解决非线性常微分方程(ODE)。

这个问题

我们考虑非线性奇摄动问题

εD ^ 2 g (x) + (g (x)) ^ 2 = 1 (0 . . 1)

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

这个问题已经很困难ε=措施,所以我们选择一个适度

ε= 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]:) +高斯* diff(休息);colsites =临时(:)。';

数值问题

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

Dy (0) = 0

(y (x)) ^ 2 +εD ^ 2 y (x) = 1 colsites x

y (1) = 0

线性化

如果y是我们目前的近似解,然后更好的(?)的线性问题解决方案吗z由牛顿法

Dz (0) = 0

w_0 (x) z (x) +εD ^ 2 z (x) = b (x) colsites x

z (1) = 0

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

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

w_2 (x): =ε,w_1 (x):在colsites 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)的网站

在哪里

colsites网站= [0,1];

需要解决的线性系统

这个系统的b样条系数转化为一个解决方案z。为此,我们需要零的,首先,在每一个二阶导数x网站和每一个相关的b样条。这些值提供的spcol命令。

这是基本的文档的一部分spcol:

SPCOL b样条搭配矩阵。

COLLOC = SPCOL(结,K,τ)是矩阵

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

与D ^ m (i) B_j m (i)倍B_j的导数,

B_j结的j K阶b样条序列节,

τ一系列网站,

结和τ都认为是不减少的,和

m (i)是整数# {j <我:τ(j) =τ(我)},即。,

“累积”的多重性τ(我)τ。

我们使用spcol供应矩阵

colmat = spcol(节,k, brk2knt(网站,3));

brk2knt这里使用三重每个条目网站,因此我们进去colmat,对于每一个x网站、价值和第一和第二衍生品x所有相关的b样。

由此,我们得到了搭配相关矩阵结合行三x使用重量w_0 (x) w_1 (x) w_2 (x)得到相对应的行x矩阵的线性系统。

需要初始猜测Y

我们还需要一个电流近似y从我们的样条空间。最初,我们通过插值得到一些合理的初始猜测从页空间网站。猜一猜,我们使用抛物线

x ^ 2 - 1

是否满足结束条件,在于我们的样条空间。我们通过插值获得其b形式网站。我们选择相关插值矩阵的矩阵colmat。在这里,在一些谨慎的步骤:

intmat = colmat ([2 (1 + (1: (n - 2)) * 3 (1 + (n - 1) * 3),:);系数= intmat \ [0 colsites。* colsites-1 0]。”;y = spmak(节,系数。');

我们策划的结果,可以肯定的是,它应该没错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;

max-norms的改变z-y在每个迭代如下输出所示,该图显示了每个迭代。

1 vtau = fnval (y, colsites);重量= [0 1 0;(2 * vtau。0 (n - 1) repmat(ε- 1));1 0 0];colloc = 0 (n, n);j = 1: n colloc (j:) =重量(j:) * colmat (3 * (j - 1) + (1:3):);结束系数= colloc \ [0 vtau。* vtau + 1 0]。';z = spmak(节,系数。');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.95151 e-05 maxdif = 4.43216平台以及
传奇({“初始猜测(x ^ 2 - 1)”“迭代”},“位置”,“西北”);

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

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

准备一个小ε

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

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

搭配网站新优惠

接下来,我们得到的搭配相应的新网站休息时间

ninterv =长度(减免)1;temp =((优惠(2:ninterv + 1) +优惠(1:ninterv)) / 2);temp = temp([1]:) +高斯* diff(休息);colsites =临时(:)。';colsites网站= [0,1];

然后新的搭配矩阵。

colmat = spcol(节,k, brk2knt(网站,3));

最初的猜测

我们获得的初始猜测y随着interpolant从当前样条空间计算的解决方案z。我们把结果interpolant可以肯定的是,它应该是接近我们当前的解决方案。

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)”“迭代”“新的初始猜测值ε”},“位置”,“西北”);

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

较小的迭代ε

现在我们分ε3,重复上面的迭代。再一次二次收敛性。

ε=ε/ 3;1 vtau = fnval (y, colsites);重量= [0 1 0;(2 * vtau。0 (n - 1) repmat(ε- 1));1 0 0];colloc = 0 (n, n);j = 1: n colloc (j:) =重量(j:) * colmat (3 * (j - 1) + (1:3):);结束系数= colloc \ [0 vtau。* vtau + 1 0]。';z = spmak(节,系数。');fnplt (z,“b”);maxdif = max (max (abs (z.coefs-y.coefs)));流(“maxdif = % g \ n”maxdif)如果(maxdif <公差),打破,结束%现在重申y = z;结束
maxdif = 0.237937 maxdif e-09 = 0.0184488 maxdif = 0.000120467 maxdif = 4.78116
甘氨胆酸ax =;h = ax.Children;传奇(h ([10 9 5 4]),{最初的猜测(x ^ 2 - 1)为ε= 1。“迭代”sprintf (“初始猜测ε= % .3f”ε)“迭代”},“位置”,“西北”);

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

非常小的ε

对于一个规模小得多的ε,我们只是重复上述计算,分裂ε每次3。

ee = 1:4节= newknt (z, ninterv + 1);休息= knt2brk(节);节= augknt(休息,4,2);n =长度(节)- k;ninterv =长度(减免)1;temp =((优惠(2:ninterv + 1) +优惠(1:ninterv)) / 2);temp = temp([1]:) +高斯* diff(休息);colsites =临时(:)。';colsites网站= [0,1];colmat = spcol(节,k, brk2knt(网站,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”ε=ε/ 3;1 vtau = fnval (y, colsites);重量= [0 1 0;(2 * vtau。0 (n - 1) repmat(ε- 1));1 0 0];colloc = 0 (n, n);j = 1: n colloc (j:) =重量(j:) * colmat (3 * (j - 1) + (1:3):);结束系数= colloc \ [0 vtau。* vtau + 1 0]。';z = spmak(节,系数。');fnplt (z,“b”);maxdif = max (max (abs (z.coefs-y.coefs)));如果(maxdif <公差),打破,结束%现在重申y = z;结束结束甘氨胆酸ax =;h = ax.Children;传奇(h ([24] 30 29 25),{最初的猜测(x ^ 2 - 1)为ε= 1。“迭代”'初始猜测ε= .1/3 ^ j, j = 1:5 '“迭代”},“位置”,“西北”);

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

阴谋破坏用于最小的ε

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

休息= fnbrk (fn2fm (z,“页”),“b”);bb = repmat(休息,3,1);cc = repmat([0, 1,南],1,长度(休息);情节(bb (:), cc (:),“r”);持有甘氨胆酸ax =;h = ax.Children;传奇(h ([31 30 26 25 1]),{最初的猜测(x ^ 2 - 1)为ε= 1。“迭代”'初始猜测ε= .1/3 ^ j, j = 1:5 '“迭代”'减免ε= .1/3 ^ 5 '},“位置”,“西北”);

图包含一个坐标轴对象。坐标轴对象包含31行类型的对象。这些对象代表初始猜测为ε= 1。(x ^ 2 - 1),迭代,初始猜测ε= .1/3 ^ j, j = 1:5,减免ε= .1/3 ^ 5。

情节为最小残余ε

回想一下,我们是解决ODE

εD ^ 2 g (x) + (g (x)) ^ 2 = 1 (0 . . 1)

检查,我们计算和情节的剩余计算最小的ε的解决方案。这看起来令人满意。

xx = linspace (0, 1201);情节(xx, 1 -ε* fnval(曾经(z, 2), xx)——(fnval (z, xx)) ^ 2)标题(“最小的ε剩余的计算解决方案”);

图包含一个坐标轴对象。坐标轴对象标题剩余最小ε的计算解决方案包含一个类型的对象。