你的程序乱七八糟。。。
Print["第", k, "次消元:"];还没有消元就要显示第一次消元了吗?
另外封号似乎也用得太多,并且For语句有些混乱。。。
乘子也没必要用矩阵形式。。。。我写一下吧:
Gauss[A_, b_, n_] :=
Module[{A1 = A, b1 = b, m},
For[k = 1, k < n, k++,
For[i = k + 1, i <= n, i++, m = A1[[i, k]]/A1[[k, k]];
b1[[i]] = b1[[i]] - mb1[[k]];
For[j = k, j <= n, j++,
A1[[i, j]] = A1[[i, j]] - mA1[[k, j]]]] Print["第", k, "次消元:",
" ", A1 // MatrixForm, " Vector b=", b1 // MatrixForm]]]
/-----------------------------------
Description:
线性方程组的数值解法:
直接法的Gauss选主元消元法;
Environment:VC6
Date:13:34 2008-3-25
Author:eryar@163com
-----------------------------------/
#include <mathh>
#include <conioh>
#include <stdioh>
#define MAX 100
typedef struct{
int row,col;
float MAT[MAX][MAX];
float Solution[MAX];
}Matrix;
void Gauss(Matrix M);
void MBack(Matrix M);
void MSave(Matrix M);
void MInput(Matrix M);
void MOutput(Matrix M);
void Solution(Matrix M);
void MSort(Matrix M,int n);
main()
{
Matrix Mat;
MInput(&Mat);
MSave(&Mat);
Gauss(&Mat);
MSave(&Mat);
if(Matrow==Matcol-1) {
MBack(&Mat);
Solution(&Mat);
}
printf("Press any key to halt");
getch();
}
void MInput(Matrix M)
{
int i,j;
printf("输入行数:"); scanf("%d",&M->row);
printf("输入列数:"); scanf("%d",&M->col);
for(i=0;i<M->row;i++){
printf("第%d行:",i+1);
for(j=0;j<M->col;j++){
scanf("%f",&M->MAT[i][j]);
}
}
for(i=0;i<M->row;i++)
M->Solution[i] = 0;
}
void MOutput(Matrix M)
{
int i,j;
printf("MATRIX:\n");
for(i=0;i<M->row;i++){
for(j=0;j<M->col;j++)
printf("%103f",M->MAT[i][j]);
printf("\n");
}
printf("---END----\n");
}
void Gauss(Matrix M)
{
int i,j,k;
float temp;
for(i=0;i<M->row-1;i++) {
MSort(M,i); MOutput(M);
for(j=i+1;j<M->row;j++) {
temp = M->MAT[j][i];
for(k=0;k<M->col;k++)
if(temp!=0) {
M->MAT[j][k] /= temp;
M->MAT[j][k] = M->MAT[i][i];
M->MAT[j][k] -= M->MAT[i][k];
}
}
}
MOutput(M);
}
void MSort(Matrix M,int n)
{
int i,j,k;
float temp[MAX];
for(i=n;i<M->row-1;i++) {
for(j=n;j<M->row-i-1;j++) {
if(fabs(M->MAT[j][n])<fabs(M->MAT[j+1][n])) {
for(k=0;k<M->col;k++) {
temp[k] = M->MAT[j+1][k];
M->MAT[j+1][k] = M->MAT[j][k];
M->MAT[j][k] = temp[k];
}
}
}
}
}
void MBack(Matrix M)
{
int i,j;
float sum;
M->Solution[M->row-1] = M->MAT[M->row-1][M->col-1]
/
M->MAT[M->row-1][M->row-1];
for(i=M->row-2;i>=0;i--) {
sum = M->MAT[i][M->col-1];
for(j=i+1;j<M->row;j++)
sum -= M->MAT[i][j]M->Solution[j];
M->Solution[i] = sum/M->MAT[i][i];
}
}
void Solution(Matrix M)
{
int i;
printf("Solution:\n");
for(i=0;i<M->row;i++)
printf("X[%d] = %f\n",i+1,M->Solution[i]);
printf("\n---END---\n");
}
void MSave(Matrix M)
{
int i,j;
FILE eryar;
eryar = fopen("Matrixtxt","a");
fprintf(eryar,"--------BEGIN--------\n");
for(i=0;i<M->row;i++) {
for(j=0;j<M->col;j++)
fprintf(eryar,"%103f",M->MAT[i][j]);
fprintf(eryar,"\n");
}
fprintf(eryar,"------eryar@163com------\n");
fclose(eryar);
}
/---Test Data:--->
输入行数:3
输入列数:4
第一行:2 -1 3 1
第二行:4 2 5 4
第三行:1 2 0 7
Solution:
X[1]=9
X[2]=-1
X[3]=6
>---Test Data---/
function [x,XA]= Gauss (A,b)
N = size(A);
n = N(1);
index = 0;
pos = zeros(n,1);
B = A;
for i=1:n
me = max(abs(B(1:n,i))); %选取列主元
for k=1:n
if(abs(A(k,i))==me)
index = k;
pos(i,1) = k; %保存列主元所在的行号
break;
end
end
m = A(index,i);
for j=1:n
if(j ~= index)
l = A(j,i);
A(j,1:n)=A(j,1:n)-lA(index,1:n)/m;
b(j)=b(j)-lb(index)/m; %消元
end
end
B = A;
for k=1:n
if(pos(k,1)~=0)
B(pos(k,1),1:n)=0; %避免列主元在同一行
end
end
end
XA = A;
for i=1:n
x(i,1)=b(pos(i,1))/A(pos(i,1),i); %求解
end
测试用例:
>> A=magic(3);x=ones(3,1);b=Ax
b =
15
15
15
>> xx=Gauss(A,b)
xx =
1
1
1
>> xx-x
ans =
0
0
0
>>
计算方法留的上机作业,难度比前几次提高数倍。感觉从来还没写过这么复杂的数学题程序- -!
#include <stdioh>
#include <stdlibh>
#define N 10 //矩阵大小范围
/
使用已经求出的x,向前计算x(供getx()调用)
float a[][] 系数矩阵
float x[] 方程组解
int i 解的序号
int n 矩阵大小
return 公式中需要的和
/
float getm(float a[N][N], float x[N], int i, int n)
{
float m = 0;
int r;
for(r=i+1; r<n; r++)
{
m += a[i][r] x[r];
}
return m;
}
/
解方程组,计算x
float a[][] 系数矩阵
float b[] 右端项
float x[] 方程组解
int i 解的序号
int n 矩阵大小
return 方程组的第i个解
/
float getx(float a[N][N], float b[N], float x[N], int i, int n)
{
float result;
if(i==n-1) //计算最后一个x的值
result = float(b[n-1]/a[n-1][n-1]);
else //计算其他x值(对于公式中的求和部分,需要调用getm()函数)
result = float((b[i]-getm(a,x,i,n))/a[i][i]);
return result;
}
void main()
{
//float a[N][N] = {{2,1,1},{1,3,2},{1,2,2}};
//float b[N] = {4,6,5};
float a[N][N]; //系数矩阵
float b[N]; //右端项
float x[N]; //方程组解
int i,j,k;
int n=N; //矩阵大小
/用户手工输入矩阵/
printf("请输入系数矩阵的大小:");
scanf("%d", &n);
printf("请连续输入矩阵值:");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
scanf("%f", &a[i][j]);
}
printf("请输入右端项:");
for(i=0; i<n; i++)
{
scanf("%f", &b[i]);
}
/显示原始矩阵/
printf("\n原始矩阵\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%f ",a[i][j]);
printf("\t|\t%f\n",b[i]);
}
printf("\n\n");
/进行高斯消去/
for(j=0; j<n-1; j++)
{
for(i=j+1; i<n; i++)
{
float m = (float)(a[i][j]/a[j][j]);
for(k=j; k<n; k++)
{
a[i][k] = a[i][k]-ma[j][k];
}
b[i] = b[i]-mb[j];
}
}
/显示处理后矩阵/
printf("高斯消去后矩阵\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%f ",a[i][j]);
printf("\t|\t%f\n",b[i]);
}
/回代方式解方程组/
for(i=n-1; i>=0; i--)
{
x[i] = getx(a,b,x,i,n);
}
/显示方程组解/
printf("\n\n方程组解\n");
for(i=0; i<n; i++)
{
printf("x%d = %f\n", i+1,x[i]);
}
}
VC60下测试通过
===================================================================
程序如下
function
x=gauss(a,b)
%高斯求解方程组
%x=gauss(a,b)
n=length(a);
a=[a,b];
for
k=1:n-1
maxa=max(abs(a(k:n,k)));
if
maxa==0
return;
end
for
i=k:n
if
abs(a(i,k))==maxa
y=a(i,k:n+1);a(i,k:n+1)=a(k,k:n+1);a(k,k:n+1)=y;
break;
end
end
for
i=k+1:n
l(i,k)=a(i,k)/a(k,k);
a(i,k+1:n+1)=a(i,k+1:n+1)-l(i,k)a(k,k+1:n+1);
end
end
%回代
if
a(n,n)==0
return
end
x(n)=a(n,n+1)/a(n,n);
for
i=n-1:-1:1
x(i)=(a(i,n+1)-sum(a(i,i+1:n)x(i+1:n)))/a(i,i);
end
调用示例如下:
>>
a=[2,-1,3;4,2,5;1,2,0];
>>
b=[1;4;7];
>>
x=gauss(a,b)
x
=
9
-1
-6
高斯列主元消去法
function X=Gauss_pivot(A,B)
% 用Gauss列主主元消去法解线性方程组AX=B
%X是未知向量
n=length(B);
X=zeros(n,1);
c=zeros(1,n);
d1=0
for i=1:n-1
max=abs(A(i,i));
m=i;
for j=i+1:n
if max<abs(A(j,i))
max=abs(A(j,i));
m=j;
end
end
if(m~=i)
for k=i:n
c(k)=A(i,k);
A(i,k)=A(m,k);
A(m,k)=c(k);
end
d1=B(i);
B(i)=B(m);
B(m)=d1;
end
for k=i+1:n
for j=i+1:n
A(k,j)=A(k,j)-A(i,j)A(k,i)/A(i,i);
end
B(k)=B(k)-B(i)A(k,i)/A(i,i);
A(k,i)=0;
end
end
%回代求解
X(n)=B(n)/A(n,n);
for i=n-1:-1:1
sum=0;
for j=i+1:n
sum=sum+A(i,j)X(j);
end
X(i)=(B(i)-sum)/A(i,i);
End
以上就是关于请看如下的Mathematica程序,演示Gauss消去法的过程,总是无法正常运行,请这里的高手过目!!!全部的内容,包括:请看如下的Mathematica程序,演示Gauss消去法的过程,总是无法正常运行,请这里的高手过目!!!、用Gauss列主元素消去法求解方程组,用c++编程、求用MATLAB写一个高斯消元法的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)