关于matlab高斯消去法,翻译下注释就可以了,在线等

关于matlab高斯消去法,翻译下注释就可以了,在线等,第1张

一楼翻译是什么东西啊?直接复制到google在线里翻译出来,还累?我看别人要想看懂才真是累!给楼主翻译了下,如果楼主对高斯消去法比较了解的话就很容易懂。

%用高斯消去法把矩阵A转换为上三角阵

[m,n]=size(A); %获得A的行和列分别存入m和n中

% 列主元素消去法

for k=1:n-1

[v,u]=max(abs(A(k:n,k))); %选出A的第k列中绝对值最大元素存入v, 而u是记录多少的行或列,并取最大值,比如有m行,n列,且n>m,则u=n

%计算矩阵A中这些元素 A(k:n,1:k)

u=u+k-1;

%因为函数返回矩阵A(k:n,1:k)中最大元素,因此我们应该变换矩阵A的值,下面进行变换

p(k)=u; %用p(k)来记录u的值

%交换第k行和第u行的数据

t1 = A(k,k:n); %为了实现交换,定义一个中间变量t1

A(k,k:n) = A(u,k:n);

A(u,k:n) = t1;

t2 = b(k); %t2是一个临时变量

b(k) = b(u);

b(u) = t2;

%前面主要是对A进行变换,即在进行消去之前,第一次先比较A中第一列绝对值最大的元素,然后再将第一列中有最大元素的那行交换到第1行,

然后用下面方法进行消去,将除第一行外的元素的第一列都消去为0;第二次然后比较A中第二列元素(此时第一行不用参与比较),将最大元素那行

交换到第二行,将3,4,5…行的第二列也变为0;依此类推,直到把A变为上三角阵,这也是为什么下面的A(k,k) ~= 0不为0的原因(有0就可省去一步)

% 高斯消去法

if A(k,k) ~= 0

%下面是高斯法消去的主要步骤,可参考有关书看看。

rows=k+1:n

A(rows,k)=A(rows,k)/A(k,k);

A(rows,rows)=A(rows,rows)-A(rows,k)A(k,k);

L(rows,rows)=A(rows,rows);

end

end

% 计算矩阵 U

for k=2:n

A(k,1:k-1)=0;

end

二、求解三角方程组的程序:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 用转换为三角矩阵法来求解Ax=b

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[m,n]=size(A); %获得A的行和列分别存入m和n中

%x(n)=b(n)/A(n,n); %计算x(n)

% 下面进行求解

for i = n : -1 : 1

t = 0;

for j = n : -1 : i+1

t = t+A(i,j)x(j);

end

x(i) = (b(i)-t)/A(i,i);

end

三、主程序:

function Examples_Eqn_Root

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 用高斯消去法求解线性方程 Ax=b

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

A = [ 1 3 6 8 9 2; %i输入矩阵 'A'

2 5 3 1 6 3;

3 6 1 2 8 5;

2 6 8 9 3 8;

5 8 9 3 2 3;

3 5 8 1 7 2];

b= [2 -3 2 55 16 -6]; %i输入 'b'

b = b'; %转换 'b'

[A,b]= Gauss(A,b) %把[A b]变换为A为上三角阵的形式

%同时将变换后的'b'返还给b

b = b'

x= Eqn_Root(A,b) %通过三角阵方法求解

end

昨天才回答过这个问题你可以再搜搜的 Gauss消去法的分析。 其包括两个过程: 消去过程:把方程组系数矩阵A化为同解的上三角矩阵; 回代过程:按相反的顺序,从xn至x1逐个求解上三角方程组。 %高斯消去法的MATLAB程序 function x=gauss(a,b); %编写高斯消去法函数 %a表示方程组的系数矩阵,b表示方程组的值 %X表示最终的输出结果,即方程组的解 n=length(b); %计算方程组的维数 %下面的程序在不断的消去,直到变成a变成上三角矩阵未知 for k=1:n-1 for i=k+1:n a(i,k)=a(i,k)/a(k,k); for j=k+1:n a(i,j)=a(i,j)-a(i,k)a(k,j); end b(i)=b(i)-a(i,k)b(k); end end %表示高斯消去法的回带过程 x=zeros(n,1); x(n)=b(n)/a(n,n); for k=n-1:-1:1 s=b(k); for j=k+1:n s=s-a(k,j)x(j); end x(k)=s/a(k,k); end 实例验证: %调用编好的消去法函数 >> A=[1,2,3;2,2,3;-1,-3,10];B=[0,3,2];gauss(A,B) ans = 30000 -15517 00345 >> A=[1,2,3;2,2,3;-1,-3,10];B=[0,3,2];x=gauss(A,B) x = 30000 -15517 00345 >> Ax %反代求解进行比较 ans = 00000 30000 20000

参阅我的文章:>

用matlab实现高斯列主元消去法解线性方程及LU分解

function x=gaussLinearEquation(A,b)

%高斯法解线性方程Ax=b

disp('原方程为AX=b:')

A

b

disp('------------------------')

n=length(b);

eps=10^-2;

for k=1:n-1

%找列主元

[mainElement,index]=max(abs(A(k:n,k)));

index=index+k-1;%index在A(k:n,k)中的行号转换为在A中的行号

if abs(mainElement)<eps

disp('列元素太小!!');

break;

elseif index>k

%列主元所在行不是当前行,将当前行与列主元所在行交换

temp=A(k,:);

A(k,:)=A(index,:);

A(index,:)=temp;

end

%消元

for i=k+1:n

m(i,k)=A(i,k)/A(k,k);%A(k,k)将A(i,k)消为0所乘系数

A(i,k:n)=A(i,k:n)-m(i,k)A(k,k:n);%第i行消元处理

b(i)=b(i)-m(i,k)b(k);%还有b也需要处理!!

end

end

disp('消元后所得到的上三角阵是')

A

%回代

b(n)=b(n)/A(n,n);

for i=n-1:-1:1

%sum(A(i,i+1:n)b(i+1:n)')表示已知

b(i)=(b(i)-sum(A(i,i+1:n)b(i+1:n)'))/A(i,i);

end

clear x;

x=b;

disp('AX=b的解x是')

x

用法:

在控制台输入:

A=[1003 0333 1504 -0333;

-2011 1455 0506 2956;

4329 -1952 0006 2087;

5113 -4004 3332 -1112];

b=[ 3005,5407,0136,3772 ]';

执行gaussLinearEquation(A,b);即可得到结果。

来,看看这个,大二时候写的

//解线性方程组

//By JJ,2008

#include<iostreamh>

#include<iomaniph>

#include<stdlibh>

//----------------------------------------------全局变量定义区

const int Number=15; //方程最大个数

double a[Number][Number],b[Number],copy_a[Number][Number],copy_b[Number]; //系数行列式

int A_y[Number]; //a[][]中随着横坐标增加列坐标的排列顺序,如a[0][0],a[1][2],a[2][1]则A_y[]={0,2,1};

int lenth,copy_lenth; //方程的个数

double a_sum; //计算行列式的值

char x; //未知量a,b,c的载体

//----------------------------------------------函数声明区

void input(); //输入方程组

void print_menu(); //打印主菜单

int choose (); //输入选择

void cramer(); //Cramer算法解方程组

void gauss_row(); //Gauss列主元解方程组

void guass_all(); //Gauss全主元解方程组

void Doolittle(); //用Doolittle算法解方程组

int Doolittle_check(double a[][Number],double b[Number]); //判断是否行列式>0,若是,调整为顺序主子式全>0

void xiaoqu_u_l(); //将行列式Doolittle分解

void calculate_u_l(); //计算Doolittle结果

double & calculate_A(int n,int m); //计算行列式

double quanpailie_A(); //根据列坐标的排列计算的值,如A_y[]={0,2,1},得sum=a[0][ A_y[0] ] a[1][ A_y[1] ] a[2][ A_y[2] ]=a[0][0]a[1][2]a[2][1];

void exchange(int m,int i); //交换A_y[m],A_y[i]

void exchange_lie(int j); //交换a[][j]与b[];

void exchange_hang(int m,int n); //分别交换a[][]和b[]中的m与n两行

void gauss_row_xiaoqu(); //Gauss列主元消去法

void gauss_all_xiaoqu(); //Gauss全主元消去法

void gauss_calculate(); //根据Gauss消去法结果计算未知量的值

void exchange_a_lie(int m,int n); //交换a[][]中的m和n列

void exchange_x(int m,int n); //交换x[]中的x[m]和x[n]

void recovery(); //恢复数据

//主函数

void main()

{

int flag=1;

input(); //输入方程

while(flag)

{

print_menu(); //打印主菜单

flag=choose(); //选择解答方式

}

}

//函数定义区

void print_menu()

{

system("cls");

cout<<"------------方程系数和常数矩阵表示如下:\n";

for(int j=0;j<lenth;j++)

cout<<"系数"<<j+1<<" ";

cout<<"\t常数";

cout<<endl;

for(int i=0;i<lenth;i++)

{

for(j=0;j<lenth;j++)

cout<<setw(8)<<setiosflags(ios::left)<<a[i][j];

cout<<"\t"<<b[i]<<endl;

}

cout<<"-----------请选择方程解答的方案----------";

cout<<"\n 1 克拉默(Cramer)法则";

cout<<"\n 2 Gauss列主元消去法";

cout<<"\n 3 Gauss全主元消去法";

cout<<"\n 4 Doolittle分解法";

cout<<"\n 5 退出";

cout<<"\n 输入你的选择:";

}

void input()

{ int i,j;

cout<<"方程的个数:";

cin>>lenth;

if(lenth>Number)

{

cout<<"It is too big\n";

return;

}

x=new char[lenth];

for(i=0;i<lenth;i++)

x[i]='a'+i;

//输入方程矩阵

//提示如何输入

cout<<"====================================================\n";

cout<<"请在每个方程里输入"<<lenth<<"系数和一个常数:\n";

cout<<"例:\n方程:a";

for(i=1;i<lenth;i++)

{

cout<<"+"<<i+1<<x[i];

}

cout<<"=10\n";

cout<<"应输入:";

for(i=0;i<lenth;i++)

cout<<i+1<<" ";

cout<<"10\n";

cout<<"==============================\n";

//输入每个方程

for(i=0;i<lenth;i++)

{

cout<<"输入方程"<<i+1<<":";

for(j=0;j<lenth;j++)

cin>>a[i][j];

cin>>b[i];

}

//备份数据

for(i=0;i<lenth;i++)

for(j=0;j<lenth;j++)

copy_a[i][j]=a[i][j];

for(i=0;i<lenth;i++)

copy_b[i]=b[i];

copy_lenth=lenth;

}

//输入选择

int choose()

{

int choice;char ch;

cin>>choice;

switch(choice)

{

case 1:cramer();break;

case 2:gauss_row();break;

case 3:guass_all();break;

case 4:Doolittle();break;

case 5:return 0;

default:cout<<"输入错误,请重新输入:";

choose();

break;

}

cout<<"\n是否换种方法求解(Y/N):";

cin>>ch;

if(ch=='n'||ch=='N') return 0;

recovery();

cout<<"\n\n\n";

return 1;

}

//用克拉默法则求解方程

void cramer()

{

int i,j;double sum,sum_x;char ch;

//令第i行的列坐标为i

cout<<"用克拉默(Cramer)法则结果如下:\n";

for(i=0;i<lenth;i++)

A_y[i]=i;

sum=calculate_A(lenth,0);

if(sum!=0)

{

cout<<"系数行列式不为零,方程有唯一的解:";

for(i=0;i<lenth;i++)

{ ch='a'+i;

a_sum=0;

for(j=0;j<lenth;j++)

A_y[j]=j;

exchange_lie(i);

sum_x=calculate_A(lenth,0);

cout<<endl<<ch<<"="<<sum_x/sum;

exchange_lie(i);

}

}

else

{

cout<<"系数行列式等于零,方程没有唯一的解";

}

cout<<"\n";

}

double & calculate_A(int n,int m) //计算行列式

{ int i;

if(n==1) {

a_sum+= quanpailie_A();

}

else{for(i=0;i<n;i++)

{ exchange(m,m+i);

calculate_A(n-1,m+1);

exchange(m,m+i);

}

}

return a_sum;

}

double quanpailie_A() //计算行列式中一种全排列的值

{

int i,j,l;

double sum=0,p;

for(i=0,l=0;i<lenth;i++)

for(j=0;A_y[j]!=i&&j<lenth;j++)

if(A_y[j]>i) l++;

for(p=1,i=0;i<lenth;i++)

p=a[i][A_y[i]];

sum+=p((l%2==0)(1):(-1));

return sum;

}

//高斯列主元排列求解方程

void gauss_row()

{

int i,j;

gauss_row_xiaoqu(); //用高斯列主元消区法将系数矩阵变成一个上三角矩阵

for(i=0;i<lenth;i++)

{

for(j=0;j<lenth;j++)

cout<<setw(10)<<setprecision(5)<<a[i][j];

cout<<setw(10)<<b[i]<<endl;

}

if(a[lenth-1][lenth-1]!=0)

{

cout<<"系数行列式不为零,方程有唯一的解:\n";

gauss_calculate();

for(i=0;i<lenth;i++) //输出结果

{

cout<<x[i]<<"="<<b[i]<<"\n";

}

}

else

cout<<"系数行列式等于零,方程没有唯一的解\n";

}

void gauss_row_xiaoqu() //高斯列主元消去法

{

int i,j,k,maxi;double lik;

cout<<"用Gauss列主元消去法结果如下:\n";

for(k=0;k<lenth-1;k++)

{

j=k;

for(maxi=i=k;i<lenth;i++)

if(a[i][j]>a[maxi][j]) maxi=i;

if(maxi!=k)

exchange_hang(k,maxi);//

for(i=k+1;i<lenth;i++)

{

lik=a[i][k]/a[k][k];

for(j=k;j<lenth;j++)

a[i][j]=a[i][j]-a[k][j]lik;

b[i]=b[i]-b[k]lik;

}

}

}

//高斯全主元排列求解方程

void guass_all()

{

int i,j;

gauss_all_xiaoqu();

for(i=0;i<lenth;i++)

{

for(j=0;j<lenth;j++)

cout<<setw(10)<<setprecision(5)<<a[i][j];

cout<<setw(10)<<b[i]<<endl;

}

if(a[lenth-1][lenth-1]!=0)

{

cout<<"系数行列式不为零,方程有唯一的解:\n";

gauss_calculate();

for(i=0;i<lenth;i++) //输出结果

{

for(j=0;x[j]!='a'+i&&j<lenth;j++);

cout<<x[j]<<"="<<b[j]<<endl;

}

}

else

cout<<"系数行列式等于零,方程没有唯一的解\n";

}

void gauss_all_xiaoqu() //Gauss全主元消去法

{

int i,j,k,maxi,maxj;double lik;

cout<<"用Gauss全主元消去法结果如下:\n";

for(k=0;k<lenth-1;k++)

{

for(maxi=maxj=i=k;i<lenth;i++)

{

for(j=k;j<lenth;j++)

if(a[i][j]>a[maxi][ maxj])

{ maxi=i;

maxj=j;

}

}

if(maxi!=k)

exchange_hang(k,maxi);

if(maxj!=k)

{

exchange_a_lie(maxj,k); //交换两列

exchange_x(maxj,k);

}

for(i=k+1;i<lenth;i++)

{

lik=a[i][k]/a[k][k];

for(j=k;j<lenth;j++)

a[i][j]=a[i][j]-a[k][j]lik;

b[i]=b[i]-b[k]lik;

}

}

}

void gauss_calculate() //高斯消去法以后计算未知量的结果

{

int i,j;double sum_ax;

b[lenth-1]=b[lenth-1]/a[lenth-1][lenth-1];

for(i=lenth-2;i>=0;i--)

{

for(j=i+1,sum_ax=0;j<lenth;j++)

sum_ax+=a[i][j]b[j];

b[i]=(b[i]-sum_ax)/a[i][i];

}

}

void Doolittle() //Doolittle消去法计算方程组

{

double temp_a[Number][Number],temp_b[Number];int i,j,flag;

for(i=0;i<lenth;i++)

for(j=0;j<lenth;j++)

temp_a[i][j]=a[i][j];

flag=Doolittle_check(temp_a,temp_b);

if(flag==0) cout<<"\n行列式为零无法用Doolittle求解";

xiaoqu_u_l();

calculate_u_l();

cout<<"用Doolittle方法求得结果如下:\n";

for(i=0;i<lenth;i++) //输出结果

{

for(j=0;x[j]!='a'+i&&j<lenth;j++);

cout<<x[j]<<"="<<b[j]<<endl;

}

}

void calculate_u_l() //计算Doolittle结果

{ int i,j;double sum_ax=0;

for(i=0;i<lenth;i++)

{

for(j=0,sum_ax=0;j<i;j++)

sum_ax+=a[i][j]b[j];

b[i]=b[i]-sum_ax;

}

for(i=lenth-1;i>=0;i--)

{

for(j=i+1,sum_ax=0;j<lenth;j++)

sum_ax+=a[i][j]b[j];

b[i]=(b[i]-sum_ax)/a[i][i];

}

}

void xiaoqu_u_l() //将行列式按Doolittle分解

{ int i,j,n,k;double temp;

for(i=1,j=0;i<lenth;i++)

a[i][j]=a[i][j]/a[0][0];

for(n=1;n<lenth;n++)

{ //求第n+1层的上三角矩阵部分即U

for(j=n;j<lenth;j++)

{ for(k=0,temp=0;k<n;k++)

temp+=a[n][k]a[k][j];

a[n][j]-=temp;

}

for(i=n+1;i<lenth;i++) //求第n+1层的下三角矩阵部分即L

{ for(k=0,temp=0;k<n;k++)

temp+=a[i][k]a[k][n];

a[i][n]=(a[i][n]-temp)/a[n][n];

}

}

}

int Doolittle_check(double temp_a[][Number],double temp_b[Number]) //若行列式不为零,将系数矩阵调整为顺序主子式大于零

{

int i,j,k,maxi;double lik,temp;

for(k=0;k<lenth-1;k++)

{

j=k;

for(maxi=i=k;i<lenth;i++)

if(temp_a[i][j]>temp_a[maxi][j]) maxi=i;

if(maxi!=k)

{ exchange_hang(k,maxi);

for(j=0;j<lenth;j++)

{ temp=temp_a[k][j];

temp_a[k][j]=temp_a[maxi][j];

temp_a[maxi][j]=temp;

}

}

for(i=k+1;i<lenth;i++)

{

lik=temp_a[i][k]/temp_a[k][k];

for(j=k;j<lenth;j++)

temp_a[i][j]=temp_a[i][j]-temp_a[k][j]lik;

temp_b[i]=temp_b[i]-temp_b[k]lik;

}

}

if(temp_a[lenth-1][lenth-1]==0) return 0;

return 1;

}

void exchange_hang(int m,int n) //交换a[][]中和b[]两行

{

int j; double temp;

for(j=0;j<lenth;j++)

{ temp=a[m][j];

a[m][j]=a[n][j];

a[n][j]=temp;

}

temp=b[m];

b[m]=b[n];

b[n]=temp;

}

void exchange(int m,int i) //交换A_y[m],A_y[i]

{ int temp;

temp=A_y[m];

A_y[m]=A_y[i];

A_y[i]=temp;

}

void exchange_lie(int j) //交换未知量b[]和第i列

{ double temp;int i;

for(i=0;i<lenth;i++)

{ temp=a[i][j];

a[i][j]=b[i];

b[i]=temp;

}

}

void exchange_a_lie(int m,int n) //交换a[]中的两列

{ double temp;int i;

for(i=0;i<lenth;i++)

{ temp=a[i][m];

a[i][m]=a[i][n];

a[i][n]=temp;

}

}

void exchange_x(int m,int n) //交换未知量x[m]与x[n]

{ char temp;

temp=x[m];

x[m]=x[n];

x[n]=temp;

}

void recovery() //用其中一种方法求解后恢复数据以便用其他方法求解

{

for(int i=0;i<lenth;i++)

for(int j=0;j<lenth;j++)

a[i][j]=copy_a[i][j];

for(i=0;i<lenth;i++)

b[i]=copy_b[i];

for(i=0;i<lenth;i++)

x[i]='a'+i;

a_sum=0;

lenth=copy_lenth;

}

program gauss

implicit real(kind=8)(a-z)

integer,parameter:: N=3

integer::i,j

real(kind=8) ::A(N,N),b(N),x(N)

open(unit=11,file='fintxt')

open(unit=12,file='fouttxt')

read(11,)

!读入A矩阵

read(11,)((A(i,j),j=1,N),i=1,n)

!读入B向量

read(11,) (b(j),j=1,n)

call solve(A,b,x,N)

write(12,999)x

999 format(T5,'高斯消去法计算结果',/,T4,'x=',4(/F128))

end program gauss

!子程序---------------

subroutine solve(A,b,x,N)

implicit real8(a-z)

integer::i,k,N

real(kind=8) ::A(N,N),b(N),x(N)

real(kind=8) ::Aup(N,N),bup(N)

!Ab为增广矩阵 [Ab]

real(kind=8) ::Ab(N,N+1)

Ab(1:N,1:N)=A

Ab(:,N+1)=b

! 这段是 高斯消去法的核心部分

do k=1,N-1

do i=k+1,N

temp=Ab(i,k)/Ab(k,k)

Ab(i,:)=Ab(i,:)-tempAb(k,:)

end do

end do

Aup(:,:)=Ab(1:N,1:N)

bup(:)=Ab(:,N+1)

!调用用上三角方程组的回带方法

call uptri(Aup,bup,x,n)

end subroutine solve

subroutine uptri(A,b,x,N)

implicit real8(a-z)

integer::i,j,N

real(kind=8) ::A(N,N),b(N),x(N)

x(N)=b(N)/A(N,N)

!回带部分

do i=n-1,1,-1

x(i)=b(i)

do j=i+1,N

x(i)=x(i)-a(i,j)x(j)

end do

x(i)=x(i)/A(i,i)

end do

end subroutine uptri

输入数据放在fintxt 记得开头加!AB

输出数据自动存放在fouttxt

大概就是个模拟,和平时解方程的过程、方法是一样的

program ttdd8;

var matrix:array[1100,1101] of double;

temp:array[1101] of double;

x:array[1100] of double;

i,j,k,n:integer;

m:double;

begin

readln(n);{一共有n个式子}

for i:=1 to n do

begin

for j:=1 to n+1 do

read(matrix[i,j]);{依次读入每个式子x1,x2…的系数及常数项}

readln;

end;

for i:=1 to n-1 do{需要消元n-1次}

begin

for j:=i to n do{寻找主元,即当前要消去元素系数最大的一个式子}

if matrix[j,i]>matrix[i,i] then

begin

temp:=matrix[i];

matrix[i]:=matrix[j];

matrix[j]:=temp;

end;

for j:=i+1 to n do

begin

m:=matrix[j,i]/matrix[i,i];

matrix[j,i]:=0;

for k:=i+1 to n+1 do

matrix[j,k]:=matrix[i,k]m-matrix[j,k];

end;

end;

x[n]:=matrix[n,n+1]/matrix[n,n];{回代过程}

for i:=n-1 downto 1 do

begin

m:=0;

for j:=i+1 to n do

m:=m+matrix[i,j]x[j];

x[i]:=(matrix[i,n+1]-m)/matrix[i,i];

end;

for i:=1 to n do

writeln(x[i]:0:2);

end

以上就是关于关于matlab高斯消去法,翻译下注释就可以了,在线等全部的内容,包括:关于matlab高斯消去法,翻译下注释就可以了,在线等、用matlab程序法编出高斯消元法、用高斯消元法解三元一次方程组,C语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存