线性方程组的直接解法
列主元消去法和LU分解法
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int inf = 0x3f3f3f3f;
typedef long long ll;
const ll linf = 1e18;
double matrix[maxn][maxn];
double x[maxn];
double b[maxn];
int n;
void change(int i, int j)
{
double tmp;
for (int k = 1; k <= n; k++)
{
tmp = matrix[i][k];
matrix[i][k] = matrix[j][k];
matrix[j][k] = tmp;
}
tmp = b[j];
b[j] = b[i];
b[i] = tmp;
}
void simp()
{
for (int i = 1; i <= n; i++)
{
double t = 0;
int index = 0;
for (int j = i; j <= n; j++)
{
if (fabs(matrix[j][i])>fabs(t))
{
t = matrix[j][i];
index = j;
}
}
change(i, index);
for (int j = i + 1; j <= n; j++)
{
double times = matrix[j][i] / t;
for (int k = i; k <= n; k++)
{
matrix[j][k] = matrix[j][k] - times * matrix[i][k];
}
b[j] = b[j]-times * b[i];
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
printf("%lf\t", matrix[i][j]);
}
printf("%lf\n",b[i]);
}
}
void solve()
{
for (int i = n; i >= 1; i--)
{
double ans = b[i];
for (int j = i+1; j <= n; j++)
{
ans -= matrix[i][j] * x[j];
}
x[i] = ans / matrix[i][i];
}
for (int i = 1; i <= n; i++)
{
cout << "x[" << i << "]= " << x[i] << endl;
}
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%lf", &matrix[i][j]);
}
scanf("%lf", &b[i]);
}
simp();
solve();
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
const int inf=0x3f3f3f3f;
typedef long long ll;
const ll linf=1e18;
double matrix[maxn][maxn];
double l[maxn][maxn];
double u[maxn][maxn];
double x[maxn];
double b[maxn];
double y[maxn];
int n;
void gety()
{
y[1]=b[1];
//cout<<y[1]<<endl;
for(int i=2;i<=n;i++)
{
y[i]=b[i];
for(int j=1;j<i;j++)
{
y[i]-=l[i][j]*y[j];
}
//cout<<y[i]<<endl;
}
}
void getx()
{
x[n]=y[n]/u[n][n];
for(int i=n-1;i>=1;i--)
{
x[i]=y[i];
for(int j=n;j>i;j--)
{
x[i]-=u[i][j]*x[j];
}
x[i]=x[i]/u[i][i];
}
}
void getlu()
{
memset(l,0,sizeof(l));
memset(u,0,sizeof(u));
for(int i=1;i<=n;i++)
l[i][i]=1;
for(int j=1;j<=n;j++)
{
u[1][j]=matrix[1][j];
}
for(int i=2;i<=n;i++)
{
l[i][1]=matrix[i][1]/u[1][1];
}
for(int r=2;r<=n;r++)
{
for(int j=r;j<=n;j++)
{
u[r][j]=matrix[r][j];
for(int k=1;k<=r-1;k++)
{
u[r][j]-=l[r][k]*u[k][j];
}
}
for(int i=r+1;i<=n;i++)
{
l[i][r]=matrix[i][r];
for(int k=1;k<=r-1;k++)
{
l[i][r]-=l[i][k]*u[k][r];
}
l[i][r]/=u[r][r];
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%lf",&matrix[i][j]);
}
scanf("%lf",&b[i]);
}
getlu();
printf("this is L:\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<l[i][j]<<" ";
}
cout<<endl;
}
printf("this is U:\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<u[i][j]<<" ";
}
cout<<endl;
}
gety();
getx();
cout<<endl;
for(int i=1;i<=n;i++)
{
cout<<"X["<<i<<"]="<<x[i]<<endl;
}
return 0;
}