数值方法算法实现[MATLAB语言]

news/2024/6/18 0:17:10 标签: matlab, 算法, 矩阵, 数值分析, 高斯消元

MATLAB计算方法算法代码

  • ❤️❤️1. LU分解
    • 💙函数文件.m
    • 💚测试脚本.m
    • 💜测试结果
  • ❤️❤️2. Gauss消元
    • 💙函数文件.m
    • 💚测试脚本.m
    • 💜测试结果
  • ❤️❤️3. 平方根法
    • 💙函数文件.m
    • 💚测试脚本.m
    • 💜测试结果
  • ❤️❤️4. Jacobi迭代
    • 💙函数文件.m
    • 💚测试脚本.m
    • 💜测试结果
  • ❤️❤️5. Gauss-Seidel迭代
    • 💙函数文件.m
    • 💚测试脚本.m
    • 💜测试结果
  • ❤️❤️6. 正交多项式曲线拟合
    • 💙函数文件.m
    • 💚测试脚本.m
    • 💜测试结果
  • ❤️❤️7. 龙贝格积分
    • 💙函数文件.m
    • 💚测试脚本.m
    • 💜测试结果

💞💞💞💞💞💞💞💞
💦💦💦💦💦💦💦💦
💫💫💫💫💫💫💫💫



❤️❤️1. LU分解


💙函数文件.m

function x= LU(A,b)
format short
%此函数用于利用LU分解法解方程组
r = rank(A);
[m,n]=size(A);
% [L,U,P]=lu(A);
% b = P*b;
L=eye(n);
for i=1:n-1
    for j=i+1:n            
            L(j,i)=A(j,i)/A(i,i);
            A(j,:)=A(j,:)-(A(j,i)/A(i,i))*A(i,:);
    end
end
U=A;
L
U

%解Ly=b
y(1) = b(1);
if m>1
    for i=2:m
        y(i)=b(i)-L(i,1:i-1)*y(1:i-1)';
    end
end
y = y';

%解Ux=y得方程组的解
x0(r)=y(r)/U(r,r);
if r>1
    for i=r-1:-1:1
        x0(i)=(y(i)-U(i,i+1:r)*x0(i+1:r)')/U(i,i);
    end
end
x0 = x0';

if flag==1
    x=x0;
    return;
else
    format rat;
    Z = null(A,'r');
    [mz,nz]=size(Z);
    x0(r+1:n)=0;
    for i=1:nz
        t=sym(char([107 48+i]));
        k(i)=t;
    end
    x=x0;
    for i=1:nz
        x = x+k(i)*Z(:,i);
    end
end

💚测试脚本.m

clear;
clc;
format short
fprintf('示例:\n');
a = [2 2 3;4 7 7;-2 4 5]
b = [3 1 -7]'
result = LU(a,b)
fprintf('======================================================================================================\n\n');

💜测试结果

示例:

a =

     2     2     3
     4     7     7
    -2     4     5


b =

     3
     1
    -7


L =

     1     0     0
     2     1     0
    -1     2     1


U =

     2     2     3
     0     3     1
     0     0     6


result =

       2       
      -2       
       1       

======================================================================================================

>> 

❤️❤️2. Gauss消元


💙函数文件.m

function [result] = gauss(a1,b)
% gauss 此处显示有关此函数的摘要
% a1-系数矩阵,b-右端常数列
[m,n] = size(a1); % 获取矩阵的阶数
a = [a1,b]; % 定义增广矩阵
for i = 1 : n-1 % i 每个主元素所在行
    for j = i + 1 : n
        if a(i,i) ~= 0
            m = -a(j,i)/a(i,i); % 定义初等行变换所需的倍数
            a(j,:) = a(j,:) + m * a(i,:); % 初等行变换,以得到约化主元下方的0else
            disp('算法失败')
        break
        end
    end
    fprintf('********************%.0f步消元结束如下:********************\n',i)
    disp(a)
%     pause
end
% 回代
b = a(:,n+1)
result(n) = b(n) / a(n,n);
fprintf('方程组的解result(%.0f) = %.5f:\n',n,result(n))
for k = (n-1):-1:1
    s = 0;
    for t = k + 1 : n
        s = s + a(k,t) * result(t);
    end
    result(k) = (b(k)-s)/a(k,k);
    fprintf('方程组的解result(%.0f) = %.5f\n',k,result(k));
end

💚测试脚本.m

clear;
clc;
fprintf('示例:\n');
a = [1 0 2 4;4 3 0 1;5 2 1 6;7 4 3 2]
b = [5 6 7 8]'
result = gauss(a,b)
fprintf('======================================================================================================\n\n');

💜测试结果

示例:

a =

       1              0              2              4       
       4              3              0              1       
       5              2              1              6       
       7              4              3              2       


b =

       5       
       6       
       7       
       8       

********************1步消元结束如下:********************
       1              0              2              4              5       
       0              3             -8            -15            -14       
       0              2             -9            -14            -18       
       0              4            -11            -26            -27       

********************2步消元结束如下:********************
       1              0              2              4              5       
       0              3             -8            -15            -14       
       0              0            -11/3           -4            -26/3     
       0              0             -1/3           -6            -25/3     

********************3步消元结束如下:********************
       1              0              2              4              5       
       0              3             -8            -15            -14       
       0              0            -11/3           -4            -26/3     
       0              0              0            -62/11         -83/11    


b =

       5       
     -14       
     -26/3     
     -83/11    

方程组的解result(4) = 1.33871:
方程组的解result(3) = 0.90323
方程组的解result(2) = 4.43548
方程组的解result(1) = -2.16129

result =

     -67/31         275/62          28/31          83/62    

======================================================================================================
>> 

❤️❤️3. 平方根法


💙函数文件.m

function x=cholesky(A,b)
%喬累斯基分解
[n,n]=size(A);
L=zeros(n,n);%實際上不用為 L 申請空間,使用 A 即可
L(1,1)=sqrt(A(1,1));
for k=2:n
L(k,1)=A(k,1)/L(1,1);
end
for k=2:n-1
L(k,k)=sqrt(A(k,k)-sum(L(k,1:k-1).^2));
for i=k+1:n
L(i,k)=(A(i,k)-sum(L(i,1:k-1).*L(k,1:k-1)))/L(k,k);
end
end
L(n,n)=sqrt(A(n,n)-sum(L(n,1:n-1).^2));
%解下三角方程組 Ly=b
y=zeros(n,1);
for k=1:n
j=1:k-1;
y(k)=(b(k)-L(k,j)*y(j))/L(k,k);
end
%解上三角方程組  L'x=y
x=zeros(n,1);
U=L';
for k=n:-1:1
j=k+1:n;
x(k)=(y(k)-U(k,j)*x(j))/U(k,k);
end
L
U
end

💚测试脚本.m

clear;
clc;
format short;
fprintf('示例:\n');
a = [4 -1 1;-1 4.25 2.75;1 2.75 3.5]
b = [4 6 7.25]'
result = Cholesky(a,b)
fprintf('======================================================================================================\n\n');

💜测试结果

示例:

a =

    4.0000   -1.0000    1.0000
   -1.0000    4.2500    2.7500
    1.0000    2.7500    3.5000


b =

    4.0000
    6.0000
    7.2500


L =

    2.0000         0         0
   -0.5000    2.0000         0
    0.5000    1.5000    1.0000


U =

    2.0000   -0.5000    0.5000
         0    2.0000    1.5000
         0         0    1.0000


result =

     1
     1
     1

======================================================================================================

>> 

❤️❤️4. Jacobi迭代


💙函数文件.m

function x=Jacobi(A,b,maxerr,N)
[n,n]=size(A);
x0=zeros(n,1);
x=zeros(n,1);      % 给x赋值
k=0;
while k<N
    for i=1:n
     x(i)=(b(i)-A(i,[1:i-1,i+1:n])*x0([1:i-1,i+1:n]))/A(i,i);
    end
    if norm(x-x0)<maxerr
        break;
    end
    x0=x;
    k=k+1;

    disp(['when k=',num2str(k)])
    disp('x=');
    disp(x);                       %输出计算的中间结果
end
if k==N
    disp('迭代次数已到达上限!');
end
disp(['迭代次数 k=',num2str(k)])
end

💚测试脚本.m

clear;
clc;
format short
fprintf('示例:\n');
a = [2 2 3;4 7 7;-2 4 5]
b = [3 1 -7]'
result = LU(a,b)
fprintf('======================================================================================================\n\n');

💜测试结果

示例:

a =

     2     2     3
     4     7     7
    -2     4     5


b =

     3
     1
    -7


L =

     1     0     0
     2     1     0
    -1     2     1


U =

     2     2     3
     0     3     1
     0     0     6


result =

       2       
      -2       
       1       

======================================================================================================

❤️❤️5. Gauss-Seidel迭代


💙函数文件.m

function x=Gauss_Seidel(A,b,maxerr,N)
[n,n]=size(A);
x0=zeros(n,1);
x=zeros(n,1);      % 给x赋值
k=0;
while k<N
    for i=1:n
        if i==1
            x(1)=(b(1)-(A(1,2:n)*x0(2:n,1)))/A(1,1);
        elseif i==n
            x(n)=(b(1)-(A(n,1:n-1)*x(1:n-1,1)))/A(n,n);
        else
            x(i)=(b(i)-(A(i,1:i-1)*x(1:i-1,1)+A(i,i+1:n)*x0(i+1:n,1)))/A(i,i);
        end
    end
    if norm(x-x0)<maxerr
        break;
    end
    x0=x;
    k=k+1;

    disp(['when k=',num2str(k)])
    disp('x=');
    disp(x);                       %输出计算的中间结果
end

if k==N
    disp('迭代次数已到达上限!');
end
disp(['迭代次数 k=',num2str(k)])

end

💚测试脚本.m

format long
fprintf('示例:\n');
a = [4 -1 1;4 -8 1;-2 1 5]
b = [7 -21 15]'
maxerr = 1e-7;
N=500;
result=Gauss_Seidel(a,b,maxerr,N)
fprintf('=========================================================================================\n\n');

💜测试结果

示例:

a =

     4    -1     1
     4    -8     1
    -2     1     5


b =

     7
   -21
    15

when k=1
x=
   1.750000000000000
   3.500000000000000
   1.400000000000000

when k=2
x=
   2.275000000000000
   3.937500000000000
   1.522500000000000

when k=3
x=
   2.353750000000000
   3.992187500000000
   1.543062500000000

when k=4
x=
   2.362281250000000
   3.999023437500000
   1.545107812500000

when k=5
x=
   2.363478906250000
   3.999877929687500
   1.545415976562500

when k=6
x=
   2.363615488281250
   3.999984741210938
   1.545449247070313

when k=7
x=
   2.363633873535156
   3.999998092651367
   1.545453930883789

when k=8
x=
   2.363636040441895
   3.999999761581421
   1.545454463860474

when k=9
x=
   2.363636324430237
   3.999999970197678
   1.545454535732559

迭代次数 k=9

result =

   2.363636358616279
   3.999999996274710
   1.545454544191570

======================================================================================================

>> 

❤️❤️6. 正交多项式曲线拟合


💙函数文件.m

function [] = Curve_fitting(x,y,n)
p = polyfit(x,y,n)
y0=polyval(p,x);
plot(x,y,'o',x,y0,'-') % 作出原数据点 和 拟合曲线图像

% 打印
s='';
len=length(p);
if (len==0)
    errordlg('矩阵不能为空');
else
    for b=1:len
        if b~=len&&b~=len-1
            if p(b)<0 && p(b)~=-1
                s=strcat(s,num2str(p(b)),'x^',num2str(len-b));
            elseif p(b)==-1
                s=strcat(s,'-','x^',num2str(len-b));
            elseif p(b)>0 && p(b)~=1
                if b==1
                    s=strcat(s,num2str(p(b)),'x^',num2str(len-b));
                else
                s=strcat(s,'+',num2str(p(b)),'x^',num2str(len-b));
                end
            elseif p(b)==1
                if b==1
                  s=strcat(s,'x^',num2str(len-b));
                else 
                    s=strcat(s,'+','x^',num2str(len-b));
                end
            else
            end
        elseif b==len
            if p(b)<0 && p(b)~=-1
                s=strcat(s,num2str(p(b)));
            elseif p(b)==-1
                s=strcat(s,'-1');
            elseif p(b)>0 && p(b)~=1
                s=strcat(s,'+',num2str(p(b)));
            elseif p(b)==1
                  s=strcat(s,'+1');
            else
            end
        else
             if p(b)<0 && p(b)~=-1
                s=strcat(s,num2str(p(b)),'x');
            elseif p(b)==-1
                s=strcat(s,'-','x');
            elseif p(b)>0 && p(b)~=1
                if b==1
                    s=strcat(s,num2str(p(b)),'x');
                else
                s=strcat(s,'+',num2str(p(b)),'x');
                end
            elseif p(b)==1
                if b==1
                  s=strcat(s,'x');
                else 
                    s=strcat(s,'+','x');
                end
            end
        end
    end
end
fprintf("%d次拟合曲线为:%s\n",n,s)
end

💚测试脚本.m

format short
fprintf('示例:\n');
x = [0 0.25 0.5 0.75 1]
y = [1 1.2840 1.6487 2.117 2.7183]
%x = [5.24 6.15 7.20 7.3 8.9 9.96 12 15.87 19.01 20.87 22.3 24.6 26.7 28.5 29.8 31.35 34.10 35.7]
%y = [3.518 3.264 2.965 2.926 2.542 2.319 1.947 1.403 1.083 0.931 0.815 0.681 0.592 0.512 0.461 0.414 0.34 0.298]
Curve_fitting(x,y,3)
fprintf('======================================================================================================\n\n');

💜测试结果

示例:

x =

         0    0.2500    0.5000    0.7500    1.0000


y =

    1.0000    1.2840    1.6487    2.1170    2.7183


p =

    0.2789    0.4253    1.0141    0.9999

3次拟合曲线为:0.27893x^3+0.42526x^2+1.0141x+0.99991
======================================================================================================

>> 

在这里插入图片描述


❤️❤️7. 龙贝格积分


💙函数文件.m

function I=Romberg(fun,a,b,e)
k=0; % 迭代次数
n=1; % 区间划分个数
h=b-a; %上下界间距
T(1,1)=h/2*(fun(a)+fun(b));
d=b-a; %误差间距
while e<=d
    k=k+1;
    h=h/2;
    sum=0;
    % 计算第一列T
    for i=1:n
        sum=sum+fun(a+(2*i-1)*h);
    end
    T(k+1,1)=T(k)/2+h*sum;
    % 迭代
    for j=1:k
        T(k+1,j+1)=T(k+1,j)+(T(k+1,j)-T(k,j))/(4^j-1);
    end
    n=n*2;
    d=abs(T(k+1,k+1)-T(k,k));
end
T
I=T(k+1,k+1);

💚测试脚本.m

clear;
clc;
fprintf('示例:\n');
format long
I=Romberg(@(x) 4/(1+x^2),0,1,0.000001)
fprintf('======================================================================================================\n\n');

💜测试结果

示例:

T =

   3.000000000000000                   0                   0                   0                   0                   0
   3.100000000000000   3.133333333333333                   0                   0                   0                   0
   3.131176470588235   3.141568627450980   3.142117647058823                   0                   0                   0
   3.138988494491089   3.141592502458707   3.141594094125888   3.141585783761874                   0                   0
   3.140941612041389   3.141592651224822   3.141592661142563   3.141592638396796   3.141592665277717                   0
   3.141429893174974   3.141592653552836   3.141592653708037   3.141592653590029   3.141592653649610   3.141592653638244


I =

   3.141592653638244

======================================================================================================

>> 

——————END-2022-05-22——————


http://www.niftyadmin.cn/n/1616260.html

相关文章

java中各种锁概念介绍,乐观锁 ,悲观锁 ,公平锁,非公平锁,可重入锁,读写锁,共享锁,自旋锁,偏向锁,轻量级锁,重量级锁等

乐观锁 乐观锁是一种乐观思想&#xff0c;即认为读多写少&#xff0c;遇到并发写的可能性低&#xff0c;每次去拿数据的时候都认为 别人不会修改&#xff0c;所以不会上锁&#xff0c;但是在更新的时候会判断一下在此期间别人有没有去更新这个数 据&#xff0c;采取在写时先读…

超详细的逐句介绍Java高级接口之文件输入/输出二进制流函数DataInputStream和DataOutputStream函数源码讲解(全)

一、DataInputStream和DataOutputStream函数 DataInputStream和DataOutputStream函数是文件输入/输出二进制流函数。 DataInputStream函数主要实现数据输入流允许应用程序以独立于机器的方式从底层输入流中读取原始 Java 数据类型。应用程序使用数据输出流写入稍后可由数据输入…

iPhone 4S将创造史上最佳销量

根据苹果公司最新发布的消息&#xff0c;iPhone4S发布当日的订单量达到100万台。而根据这个消息&#xff0c;市场分析师预计iPhone4S正式上市后的首三日销量将可达300万 台&#xff0c;而本季度销量可达2500万台。这也代表着iPhone4S的销量将打破iPhone4去年所创下的销量纪录&a…

数据库DDL(Data Definition Language,数据定义语言)知识点

数据库学习整理数据库-DDL01. 查看所有数据库02. 创建数据库03. 选择使用数据库04. 删除数据库05. 修改数据库编码06. 数据库中创建表07. 数值类型08. 字符串类型09. 日期类型10. 查看当前数据库所有的表11. 查看指定表12. 查看表结构13. 删除指定表14. 表中添加一列15. 修改列…

Facebook收购的14家公司盘点

自从2007年收购第一家公司尝到甜头以来&#xff0c;Facebook对于收购的重视程度与日俱增。 然而&#xff0c;Facebook的收购并非是为了这些公司的技术&#xff0c;大多数公司在Facebook完成收购后很快就被关闭。Facebook看中的是这些公司的技术天才们&#xff0c;为留住这些人&…

详细介绍yum仓库搭建的两种方式

一、yum仓库 yum仓库用于存放各种rpm的软件包以及软件包之间的依赖关系&#xff0c;我们正常用rpm命令安装时会导致软件的相互依赖进而导致文件安装失败&#xff0c;yum可以在很大程度上避免这个发生&#xff0c;下面我将详细介绍yum仓库的搭建。 二、本地安装 1、创建文件存…

数据库中COMMENT关键字的使用

COMMENT的使用介绍 作用&#xff1a;为字段或列添加注释。 1. 创建表时为字段添加注释 CREATE TABLE emp(emp_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 编号,emp_name CHAR(20) NOT NULL DEFAULT COMMENT 姓名,salary DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT 工资,depa…

Facebook iPad App体验视频

Facebook已经正式推出了其iPad应用&#xff0c;现已可在App Store上下载。同时Facebook也对其在iPhone上的应用也进行了升级。增加应用书签和全新的请求对话框&#xff0c;可以显示应用的通知&#xff0c;同时还支持Facebook Credits。 Facebook的iPad应用可以让你在iPad9.7英寸…