数值分析(应用数学)课程常用matlab算法
数值分析(应用数学)课程常用matlab算法
数值计算是工科专业经常接触到的课程,介绍的算法包括代数方程组求解、函数插值、数值积分与微分、常微分方程求解。本文不对算法原理进行介绍,读者可参考应用数学、数值分析、工程数学等教材。(能找过来的同学估计都是上过课的)
代数方程组求解
线性方程组:Gauss消元方法(列主元素),追赶法,迭代法
非线性方程组:不动点法、牛顿迭代法
Gauss消元方法(列主元素)
function [x] = myGauss(A,B)
% Gauss消元方法(列主元素)求解方程组
% 此处显示详细说明
% A 系数矩阵
% B b向量
[n1,n2]=size(A);
n=length(B);
if (n1~=n || n2~=n)
error("参数输入有误");
end
if isrow(B)
B=B';
end
disp('增广矩阵A|B为:');
disp([A,B]);
x=zeros(n,1);
for i=1:n-1
[~,m_index]=max(abs(A([i:n],i)));
m_index=m_index+i-1;
if (i~=m_index)
A([i,m_index],:)=A([m_index,i],:);
B([i,m_index])=B([m_index,i]);
disp(['交换第' num2str(i) '和第' num2str(m_index) '行:']);
disp([A,B]);
end
for j=i+1:n
l=A(j,i)/A(i,i);
A(j,:)=A(j,:)-A(i,:)*l;
B(j)=B(j)-B(i)*l;
end
disp(['第' num2str(i) '次消元:']);
disp([A,B]);
end
%回代
x(n)=B(n)/A(n,n);
for i=n-1:-1:1
sum=0;
for k=i+1:n
sum=sum+A(i,k)*x(k);
end
x(i)=(B(i)-sum)/A(i,i);
end
disp('方程组的解为:');
disp(x);
end
追赶法
输入参数a,b,c,f分别为上图中的ai,bi,ci,fi写成数组形式
function [x] = zhuiganfa(a,b,c,f)
% 追赶法解三对角方程组
% a,b,c皆为行向量
na=length(a);
nb=length(b);
nc=length(c);
n=length(f);
if (any([na+1,nb,nc+1,n]-n))
error("参数输入有误");
end
a=[0 a];
A=zeros(n,n);
for i=1:n
A(i,i)=b(i);
end
for i=1:n-1
A(i+1,i)=a(i+1);
A(i,i+1)=c(i);
end
disp('方程组增广矩阵为:');
disp([A,f']);
l=zeros(1,n);
y=zeros(1,n);
x=zeros(1,n);
l(2)=a(2)/b(1);
for i=3:n
l(i)=a(i)/(b(i-1)-c(i-2)*l(i-1));
end
disp(['l2 … l' num2str(n) '分别为:']);
disp(l(2:n));
y(1)=f(1);
for i=2:n
y(i)=f(i)-l(i)*y(i-1);
end
disp(['y1 … y'