C语言怎么给追赶法编程序
发布网友
发布时间:2022-05-05 23:28
我来回答
共3个回答
热心网友
时间:2022-06-28 07:31
1、追赶法是针对系数矩阵为三对角阵的方程组,因此是一种特殊的方程组.此方法效率较高,不过不适用于一般的线性方程组。Gauss消去法是针对一般的线性方程组,与线性代数中的初等变换解线性方程组方法类似。
2、例程:
#include<stdio.h>
#define n 4
void main()
{
int i;
float a[n],b[n],c[n],d[n],u[n],l[n-1];
float x[n],y[n];
printf("请输入系数矩阵(按a[i],b[i],c[i],d[i]输入):\n");
for(i=0;i<n;i++)
{
scanf("%f",&a[i]); //a[n]和c[n]要少一项,使a[n-1]=c[n-1]=0,便于输入.
scanf("%f",&b[i]);
scanf("%f",&c[i]);
scanf("%f",&d[i]);
}
u[0]=b[0];
for(i=1;i<n;i++)
{
l[i-1]=a[i-1]/u[i-1];
u[i]=b[i]-l[i-1]*c[i-1];
}
/* for(i=0;i<n-1;i++)
printf("%f\n",l[i]);
for(i=0;i<n;i++)
printf("%f\n",u[i]);*/
y[0]=d[0];
// printf("y1=%f\n",y[0]);
for(i=1;i<n;i++)
{
y[i]=d[i]-l[i-1]*y[i-1];
// printf("y%d=%f\n",i+1,y[i]);
}
x[n-1]=y[n-1]/u[n-1];
for(i=n-2;i>=0;i--)
x[i]=(y[i]-c[i]*x[i+1])/u[i];
for(i=0;i<n;i++)
printf("x%d=%f\n",i+1,x[i]);
}
热心网友
时间:2022-06-28 07:31
1、追赶法是针对系数矩阵为三对角阵的方程组,因此是一种特殊的方程组.此方法效率较高,不过不适用于一般的线性方程组。Gauss消去法是针对一般的线性方程组,与线性代数中的初等变换解线性方程组方法类似。
2、例程:
#include<stdio.h>
#define n 4
void main()
{
int i;
float a[n],b[n],c[n],d[n],u[n],l[n-1];
float x[n],y[n];
printf("请输入系数矩阵(按a[i],b[i],c[i],d[i]输入):\n");
for(i=0;i<n;i++)
{
scanf("%f",&a[i]); //a[n]和c[n]要少一项,使a[n-1]=c[n-1]=0,便于输入.
scanf("%f",&b[i]);
scanf("%f",&c[i]);
scanf("%f",&d[i]);
}
u[0]=b[0];
for(i=1;i<n;i++)
{
l[i-1]=a[i-1]/u[i-1];
u[i]=b[i]-l[i-1]*c[i-1];
}
/* for(i=0;i<n-1;i++)
printf("%f\n",l[i]);
for(i=0;i<n;i++)
printf("%f\n",u[i]);*/
y[0]=d[0];
// printf("y1=%f\n",y[0]);
for(i=1;i<n;i++)
{
y[i]=d[i]-l[i-1]*y[i-1];
// printf("y%d=%f\n",i+1,y[i]);
}
x[n-1]=y[n-1]/u[n-1];
for(i=n-2;i>=0;i--)
x[i]=(y[i]-c[i]*x[i+1])/u[i];
for(i=0;i<n;i++)
printf("x%d=%f\n",i+1,x[i]);
}
热心网友
时间:2022-06-28 07:32
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
const int n=4; //n为方程组系数矩阵的阶数
float b[n+1]; //b[]为三对角系数矩阵的对角元素,b[0]不用
float c[n]; //c[]为三对角系数矩阵的上对角元素,c[0]不用
float a[n]; //a[]为三对角系数矩阵的下对角元素,a[0]不用
float f[n+1]; //f[]为方程组的常向量项
float L[n+1]; //克劳特分解A=LU,其中,L为下二对角矩阵.L[]存放其对角元素,L[0]不用
float U[n]; //U为单位上二对角矩阵.U[]存放其上对角元素,U[0]不用
int main()
{
int i,j;//输入c[]
cout<<"请输入三对角方程组系数矩阵的上对角元素: "<<endl;
for(i=1;i<n;i++)
cin>>c[i];//输入b[]
cout<<"请输入三对角方程组系数矩阵的中对角元素: "<<endl;
for(i=1;i<=n;i++)
cin>>b[i];//输入a[]
cout<<"请输入三对角方程组系数矩阵的下对角元素: "<<endl;
for(i=2;i<=n;i++)
cin>>a[i];//输入常向量项
cout<<"请输入方程组常向量: "<<endl;
for(i=1;i<=n;i++)
cin>>f[i];//计算L和U的各元素
L[1]=b[1];
for(i=1;i<n;i++)
{
U[i]=c[i]/L[i];
L[i+1]=b[i+1]-a[i+1]*U[i];
}//求解Ly=f,追赶法中的"追"
float y[n+1];
y[1]=f[1]/L[1];
for(i=2;i<=n;i++)
{
y[i]=(f[i]-a[i]*y[i-1])/L[i];
}//求解Ux=y,追赶法中的"赶",将解向量存放在f[]中
f[n]=y[n];
for(i=n-1;i>=1;i--)
{
f[i]=y[i]-U[i]*f[i+1];
}//输出解
cout<<"三对角方程组的解是:"<<endl;
for(i=1;i<=n;i++)
cout<<setiosflags(ios::fixed)<<setprecision(2)<<"x"<<i<<"="<<f[i]<<'\n';
cout<<endl;
return 0;
}