• 实验九 数据微积分与方程数值求解(matlab)


    实验九 数据微积分与方程数值求解

    1.1实验目的

    1.2实验内容

    1.3流程图

    1.4程序清单

    1.5运行结果及分析

    1.6实验的收获与体会

    1.1实验目的

    1,掌握求数值导数和数值积分的方法;

    2,掌握代数方程数组求解的方法;

    3,掌握多常微分方程数值求解的方法。

    1.2实验内容

    1.3流程图

    1.4程序清单

    %%

    clc

    clear

    %% 1

    clear;clc

    x=1;i=1;

    f=inline('det([x x.^2 x.^3;1+0*x 2*x 3*x.*x;0*x 2+0*x 6*x])');

    while x<=3.01

        g(i)=f(x);

        i=i+1;

        x=x+0.01;

    end

    g;

    dx=diff(g)/0.01;

    f1=dx(1)

    f2=dx(101)                                    

    f3=dx(length(g)-1)

    %% 2

    clear

    g1=inline('sqrt(cos(t.^2)+4*(sin(2.*t)).^2+1)');

    g2=inline('log(1+x)./(1+x.^2)');

    I1=quadl(g1,0,2*pi);

    I2=quadl(g2,0,1);

    %% 3

    clear

    A=[6 5 -2 5;

        9 -1 4 -1;

        3 4 2 -2;

        3 -9  0 2];

    b=[-4 13 1 11]';

    x(:,1)=A\b;

    [L,U]=lu(A);

    x(:,2)=U\(L\b);

    [Q,R]=qr(A);

    x(:,3)=R\(Q\b);

    %% 4

    clear

    A=[2 7 3 1;

        3 5 2 2;

        9 4 1 7];

    b=[6 4 2]';

    [x,y]= line_solution(A,b)

    %% 5

    clear

    f=inline('3*x+sin(x)-exp(x)');

    root_near=fzero(f,1.5);

    X=fsolve('myfun',[1,1,1],optimset('Display','off'))

    %% 6

    clear

    f=inline('(x^3+cos(x)+x*log10(x))/exp(x)');

    [x,fval]=fminbnd(f,0,1);

    [U,fmin]=fminsearch('fxy',[0,0]);

    %% 7

    clear

    [x,y]=ode45('sys',[eps,10000],[eps,eps])

    plot(x,y(:,1))

    %% 8

    clear

    [T,Y]=ode45('rigid',[0 12],[0 1 1]);

    plot(T,Y(:,1),'-',T,Y(:,2),'*',T,Y(:,3),'+');

    相关函数:

    function f = fj( x )

    %UNTITLED3 此处显示有关此函数的摘要

    %   此处显示详细说明

    f=[x x^2 x^3;1 2*x 3*x^2; 0 2 6*x];

    end

    function [S_H, S_P] = line_solution(A,b)

    % 输入参数A:系数矩阵

    % 输入参数b:Ax=b的常数项列向量b

    % S_H:齐次线性方程组的基础解系

    % S_P:非齐次线性方程组的特解

    if size(A,1) ~= length(b)   %size(A,1)求矩阵的行数

        error('输入数据错误,请重新输入!');

        return;

    else

        B = [A,b];  %增广矩阵

        rank_A = rank(A);   %求系数矩阵的秩

        rank_B = rank(B);   %求增广矩阵的秩

        if rank_A ~= rank_B %无解情况

            disp('线性方程组无解!');

            S_H = [];

            S_P = [];

        else if rank_B == size(A,2) %若增广矩阵的秩 = 未知量个数

                %size(A,2)求矩阵的列数,相当于length(A)

                disp('线性方程组有唯一解!');

                S_P = A\b;  %求唯一解

                S_H = [];

            else

                disp('线性方程组有无穷解!');

                S_H = null(A,'r');%求出齐次方程组的基础解系

                S_P = A\b;  %求非齐次方程组的特解

            end

        end

    end

    function F = myfun( X )

    %UNTITLED6 此处显示有关此函数的摘要

    %   此处显示详细说明

    x=X(1);y=X(2);z=X(3);

    F(1)=sin(x)+y^2+log(z);

    F(2)=3*x+z^y-z^3+1;

    F(3)=x+y+z-5;

    end

    function f = fxy( u )

    %UNTITLED7 此处显示有关此函数的摘要

    %   此处显示详细说明

    x=u(1);y=u(2);

    f=2*x^3+4*x*y^3-10*x*y+y^2;

    end

    function xdot =sys( x,y )

    %UNTITLED8 此处显示有关此函数的摘要

    %   此处显示详细说明

    xdot=[y(2);(5*y(2)-y(1))/x];

    end

    function dy = rigid( t,y)

    %UNTITLED10 此处显示有关此函数的摘要

    %   此处显示详细说明

    dy=zeros(3,1);

    dy(1)=y(2)*y(3);

    dy(2)=y(1)*y(3);

    dy(3)=-0.51*y(2)*y(1);

    end

    1.5运行结果及分析

    1. 

    2.

    3.

    4.x的列向量乘以一个常数加上y就是通解。

    5.

    6.

    7.可以看出结果发散。

    8.

    1.6实验的收获与体会

    本次实验过后,我掌握了求数值导数和数值积分的方法和代数方程数组求解的方法,同时也掌握多常微分方程数值求解的方法。

    数据微积分与方程数值求解是特别有用的工具。微积分的数值解法可以满足工程领域的需要,方程数值求解也可以满足一些需要。而往往工程问题都是不容易直接得出解析解的,那么这种情况,就需要使用数值解法来进行计算。虽然说有误差,但是这些误差都是实际践行中可以被接受和使用的。各种方法在matlab里面就只表现为一个函数,使用起来非常方便快捷。一些数值求解的过程,往往需要大规模的迭代计算,当然也可能因为结果发散,而无法迭代出一个收敛的结果,这也是很正常的一件事情,可能与系统结构相关。

    总之,经过这次实验收获很大,对学习帮助很大。

    源文档也可以有偿发(1块2米都可以),欢迎私聊!!!

    欢迎向我赞赏:

    赞赏作者https://nyzhhd.github.io/zsm.html

  • 相关阅读:
    在Qt中使用MySQL
    『手写Mybatis』实现映射器的注册和使用
    java springboot在当前测试类中添加临时属性 不影响application和其他范围
    c++中和c语言不相同的地方
    如何利用Java实现 AI 人脸融合特效
    中级软件设计师考试(软考中级)网络与信息安全基础
    LAMP集群分布式安全方案
    大数据学习:使用Java API操作HDFS
    记一次 .NET 某工控视觉软件 非托管泄漏分析
    Git基础入门
  • 原文地址:https://blog.csdn.net/m0_51738372/article/details/127984910