Crout分解å³è¿½èµ¶æ³•是专门用于求解三对角方程组的,这类方程组ç»å¸¸å‡ºçŽ°åœ¨ç”¨å·®åˆ†æ–¹æ³•æˆ–æœ‰é™å…ƒæ³•求解二阶常微分方程边值问题ã€çƒä¼ 导问题åŠä¸‰æ¬¡æ ·æ¡å‡½æ•°æ’值问题ä¸ï¼ŒçŸ©é˜µAçš„å„阶顺åºä¸»åå¼ä¸ä¸º0时有解,三对角矩阵å„阶顺åºä¸»åå¼éƒ½ä¸ä¸º0的一个充分æ¡ä»¶æ˜¯|a[i]|>|c[i]|+|b[i]|,c[i]*b[i]!=0
,
å³å¯¹è§’å 优
当三对角矩阵满足对角å 优时,追赶法是数值稳定的算法,具有程åºç®€å•,å˜è´®é‡å°å’Œè®¡ç®—é‡å°ç‰ä¼˜ç‚¹ã€‚
#include <stdio.h>
#define N 1000
double a[N];
double b[N];
double c[N];
double d[N];
double x[N];
double y[N];
int n;
inline double abs(double x)
{if(x<0)return (-x);return x;}
int main()
{
int i;
int flag;
while(scanf("%d",&n),n)
{
flag=1;
for(i=0;i<n-1;++i)
scanf("%lf",&c[i]);
for(i=0;i<n;++i)
scanf("%lf",&a[i]);
for(i=1;i<n;++i)
scanf("%lf",&b[i]);
for(i=0;i<n;++i)
scanf("%lf",&d[i]);
for(i=0;i<n;++i)
{
if(i==0 && !(abs(a[i])>abs(c[i]) && c[i]!=0))
{
flag=0;
break;
}
else if(i==(n-1) && !(abs(a[i])>abs(b[i]) && b[i]!=0))
{
flag=0;
break;
}
else if(!(abs(a[i])>=(abs(c[i])+abs(b[i]))) || (c[i]*b[i]>-(1e-8) && c[i]*b[i]<1e-8))
{
flag=0;
break;
}
}
if(flag)
{
for(i=0;i<n;++i)
{
if(i!=0)
a[i]=a[i]-b[i]*c[i-1];
if(a[i]==0)
{
flag=0;
break;
}
c[i]=c[i]/a[i];
}
}
if(flag)
{
y[0]=d[0]/a[0];
for(i=1;i<n;++i)
y[i]=(d[i]-y[i-1]*b[i])/a[i];
x[n-1]=y[n-1];
for(i=n-2;i>=0;--i)
x[i]=y[i]-x[i+1]*c[i];
for(i=0;i<n;++i)
printf("%lf ",x[i]);
}
else
printf("no unique solution");
printf("\n");
}
return 0;
}