一楼翻译是什么东西啊?直接复制到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语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)