标签:
试编出下列子程序:
(1)实现矩阵三角分解A=LU;
(2)利用分解因子L,U解方程组AX=b(即先求解LY=b 再求解UX=Y)的子程序。
利用上述子程序解线性方程组AX=bk(k=1,2,…,10),其中
A=1 2 4 7 11 16
2 3 5 8 12 17
4 5 6 9 13 18
7 8 9 10 14 19
11 12 13 14 15 20
16 17 18 19 20 21
b1为任一非零的六元向量;若记Xk为AX= bk的解向量,则取bk+1=Xk/||Xk||.请输出结果:L;U;bk;Xk (k=1,2,…,10).并认真观察之,能发现什么有趣的现象.
还是计算方法的作业,按照书中的公式和流程图实现一下
input
6
1 2 4 7 11 16
2 3 5 8 12 17
4 5 6 9 13 18
7 8 9 10 14 19
11 12 13 14 15 20
16 17 18 19 20 21
b向量任意:6个1就行
1 1 1 1 1 1
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <math.h>
using namespace std;
const int MAXN=1000;
int N;
double A[MAXN][MAXN];
double b[MAXN];
double x[MAXN];
double y[MAXN];
//double L[MAXN][MAXN];
//double U[MAXN][MAXN];
void initA(){
printf("输入矩阵A的阶数:");
cin>>N;
printf("输入矩阵A\n");
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
cin>>A[i][j];
}
}
}
void initb(){
printf("输入b向量\n");
for(int i=1;i<=N;i++){
cin>>b[i];
}
}
void duliteer(){//紧凑格式得到A=LU
double sum;
for(int i=2;i<=N;i++){
A[i][1]=A[i][1]/A[1][1];
}
for(int k=2;k<=N;k++){
for(int i=k;i<=N;i++){
sum=0;
for(int j=1;j<=k-1;j++){
sum+=A[k][j]*A[j][i];
}
A[k][i]=A[k][i]-sum;
}
for(int i=k+1;i<=N;i++){
sum=0;
for(int j=1;j<=k-1;j++){
sum+=A[i][j]*A[j][k];
}
A[i][k]=(A[i][k]-sum)/A[k][k];
}
}
}
void gety(){
y[1]=b[1];
double sum;
for(int k=2;k<=N;k++){
sum=0;
for(int j=1;j<=k-1;j++){
sum+=A[k][j]*y[j];
}
y[k]=b[k]-sum;
}
}
void getx(){
double sum,M;
x[N]=y[N]/A[N][N];
x[0]=fabs(x[N]);
for(int k=N-1;k>=1;k--){
sum=0;
for(int j=k+1;j<=N;j++){
sum+=A[k][j]*x[j];
}
x[k]=(y[k]-sum)/A[k][k];
x[0]=max(x[0],fabs(x[k]));
}
}
void xianshi(){
cout<<endl;
printf("L和U分别为:\n");
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(i==j){
cout<<setw(5)<<1;
cout<<" ";
}
cout<<setw(5)<<A[i][j]<<" ";
}
cout<<endl;
}
}
void output(){
printf("b向量为:\n");
for(int i=1;i<=N;i++){
cout<<b[i]<<" ";
}
cout<<endl;
printf("x向量为:\n");
for(int i=1;i<=N;i++){
cout<<x[i]<<" ";
}
cout<<endl;
}
int main(){
while(1){
initA();
initb();
duliteer();
gety();
getx();
xianshi();
for(int i=1;i<=10;i++){
cout<<endl;
printf("第(%d)种:\n",i);
output();
for(int j=1;j<=N;j++){
b[j]=x[j]/x[0];
}
gety();
getx();
}
cout<<endl;
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/qdbszsj/article/details/45272739