📄 直接三角分解法.cpp
字号:
#include<iostream>
#include<iomanip>
#include<fstream>
using namespace std;
//
const int SIZE=100;
double a[SIZE][SIZE];
double u[SIZE][SIZE]={0};
double l[SIZE][SIZE]={0};
double b[SIZE];
int n;//n维
double EPS;//精确度
double x[SIZE];
//
void input()//从文件中读入
{
ifstream in("in.txt");
if(!in){cout<<"文件中没有数据!请先在文本中输入数据!"<<endl;exit(1);}
in>>n;
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
in>>a[i][j];
}
}
for(int k=0;k<n;++k)
in>>b[k];
in>>EPS;
cout<<"成功读入!"<<endl;
}
//
void print()//原始显示数据
{
cout<<left<<"A矩阵的原始数据 :"<<endl;
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
cout<<setw(10)<<a[i][j]<<' ';
cout<<endl;
}
cout<<"B矩阵的原始数据 :"<<endl;
for(int k=0;k<n;++k)
cout<<setw(10)<<b[k]<<' ';
cout<<endl;
}
//
void d1()//处理上三解
{
double sum;
for(int i=n-1;i>=0;--i)
{
sum=0;
if(i==(n-1))
x[n-1]=b[n-1]/u[n-1][n-1];
else
{
for(int j=i+1;j<n;++j)
{
sum+=-u[i][j]*x[j];
}
x[i]=(sum+b[i])/u[i][i];
}
}
}
//
void showx()//显示x
{
cout<<endl;
cout<<"最后X的值为:"<<endl;
for(int i=0;i<n;++i)
{
cout<<left<<setw(10)<<x[i]<<' ';
}
cout<<endl;
}
void deal()//处理
{
int i,j,k,g,h;
double sum;
b[n]=0;
for(i=0;i<n+1;++i)
{
a[i][n]=b[i];
a[n][i]=0;
}
//
for(i=0;i<n+1;++i)
{
if(i==0)
{
for(j=i;j<n+1;++j)
{
u[i][j]=a[i][j];
l[j][i]=a[j][i]/a[i][i];
}
}
else
{
//U
for(j=i;j<n+1;++j)
{
sum=0;
for(k=0;k<j;k++)
sum+=l[i][k]*u[k][j];
u[i][j]=a[i][j]-sum;
}
//L
for(j=i;j<n+1;++j)
{
sum=0;
for(k=0;k<j;k++)
sum+=l[j][k]*u[k][i];
l[j][i]=(a[j][i]-sum)/u[i][i];
}
}
}
for(i=0;i<n;++i)
b[i]=u[i][n];
}
//
void print2()
{
int i,j;
//U
cout<<"显示U矩阵 :"<<endl;
for(i=0;i<n+1;++i)
{
for(j=0;j<n;++j)
{
cout<<setw(10)<<u[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
//L
cout<<"显示L矩阵 :"<<endl;
for(i=0;i<n+1;++i)
{
for(j=0;j<n;++j)
{
cout<<setw(10)<<l[i][j]<<' ';
}
cout<<endl;
}
cout<<endl;
//B
cout<<"显示B矩阵 :"<<endl;
for(i=0;i<n;++i)
{
cout<<setw(10)<<b[i]<<' ';
}
cout<<endl;
}
//
void main()
{
input();
print();
deal();
print2();
d1();
showx();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -