此示例显示如何使用曲线拟合工具箱™解决非线性常微分方程(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):= 1
那w_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]);抓住在
我们现在可以完成线性系统的构造和求解,得到改进的近似解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');
从牛顿迭代预期的那样看起来像二次收敛。
如果我们现在减少ε
,我们在右端点附近创建更多的边界层,这需要一个非均匀网格。我们使用纽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');
现在我们分裂了ε
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');
一个小得多的ε
,我们只是重复这些计算,除法ε
每次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');
这是最终分布休息时间
,显示纽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');
回想一下,我们在解ODE
在[0..1]上D^2g(x) + (g(x))^2 = 1
作为检验,我们计算并绘制出最小的的计算解的残差。这看起来也令人满意。
xx = linspace (0, 1201);*fnval(fnder(z,2),xx) - (fnval(z,xx)).^2)'对于最小的epsilon的计算解决方案'的剩余物);