此示例显示如何使用曲线拟合工具箱™解决非线性常微分方程(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):=1
那w_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
从我们的花键空间。最初,我们通过从我们的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]);抓住在…上
我们现在可以完成用于改进的近似解决方案的线性系统的构造和解决方案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)''迭代'},'地点'那“西北”);
从牛顿迭代预期的那样看起来像二次收敛。
如果我们现在减少埃斯利昂
,我们在右端点附近创建更多的边界层,并且此呼叫不均匀的网格。我们用纽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新价值的新初步猜测'},......'地点'那“西北”);
现在我们分开埃斯利昂
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)......'迭代'},'地点'那“西北”);
一个更小的埃斯利昂
,我们只是重复这些计算,除以埃斯利昂
每次三点。
为了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'......'迭代'},'地点'那“西北”);
这是最终分布休息
,显示纽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'},'地点'那“西北”);
回想一下,我们正在解决颂歌
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的计算解决方案'的剩余物);