请看如下的Mathematica程序,演示Gauss消去法的过程,总是无法正常运行,请这里的高手过目!!!

请看如下的Mathematica程序,演示Gauss消去法的过程,总是无法正常运行,请这里的高手过目!!!,第1张

你的程序乱七八糟。。。

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写一个高斯消元法的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10637866.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存