• 安徽某高校《数学建模》上机习题1选讲(建立范德蒙矩阵;解线性方程组)


    (工具:matlab

    第一题:

    利用自己的学号建立一个维数为n的行向量a1; (n为学号所含数字个数)

    建立n阶Vandermonde(范德蒙)矩阵A, A的第二行向量为a1

    【假设笔者学号为:114514】

    方法一:直接生成法

    最简单直接的方法,调用matlab中的vander()函数直接生成:

    1. clc,clear,close all
    2. A = vander([1,1,4,5,1,4])

    但是我们这样做会有一个问题,我们发现生成的矩阵是这样的:

    1. A =
    2. 1 1 1 1 1 1
    3. 1 1 1 1 1 1
    4. 1024 256 64 16 4 1
    5. 3125 625 125 25 5 1
    6. 1 1 1 1 1 1
    7. 1024 256 64 16 4 1

    这显然不符合题目的要求:希望我生成的第二行是我的学号114514,

    所以我们只需要调用rot90()函数,将我们生成的矩阵逆时针旋转90度就可以了:

    1. clc,clear,close all
    2. A1 = vander([1,1,4,5,1,4])
    3. A2 = rot90(A1)

    生成的矩阵A2就是我们的目标矩阵:

    1. A2 =
    2. 1 1 1 1 1 1
    3. 1 1 4 5 1 4
    4. 1 1 16 25 1 16
    5. 1 1 64 125 1 64
    6. 1 1 256 625 1 256
    7. 1 1 1024 3125 1 1024

    方法二:“中间矩阵”法

    我们也可以先建立两个矩阵A1,B1:

    1. clc,clear,close all
    2. A1 = [1,1,4,5,1,4]
    3. B1 = reshape(0:5,6,1)

    它们的结果是:

    1. A1 =
    2. 1 1 4 5 1 4
    3. B1 =
    4. 0
    5. 1
    6. 2
    7. 3
    8. 4
    9. 5

    接下来我们利用repmat()函数生成有重复内容的矩阵A2,B2:

    1. clc,clear,close all
    2. A1 = [1,1,4,5,1,4]
    3. B1 = reshape(0:5,6,1)
    4. A2 = repmat(A1,6,1)
    5. B2 = repmat(B1,1,6)

    生成的A2,B2:

    1. A2 =
    2. 1 1 4 5 1 4
    3. 1 1 4 5 1 4
    4. 1 1 4 5 1 4
    5. 1 1 4 5 1 4
    6. 1 1 4 5 1 4
    7. 1 1 4 5 1 4
    8. B2 =
    9. 0 0 0 0 0 0
    10. 1 1 1 1 1 1
    11. 2 2 2 2 2 2
    12. 3 3 3 3 3 3
    13. 4 4 4 4 4 4
    14. 5 5 5 5 5 5

    我们不难发现,对于我们的目标范德蒙矩阵,A2可以看作目标矩阵的“底数矩阵”,B2可以看作目标矩阵的“指数矩阵”,所以我们只需要将这两个矩阵结合一下:

    1. clc,clear,close all
    2. A1 = [1,1,4,5,1,4]
    3. B1 = reshape(0:5,6,1)
    4. A2 = repmat(A1,6,1)
    5. B2 = repmat(B1,1,6)
    6. M = A2.^B2

    就可以生成目标矩阵了:

    1. M =
    2. 1 1 1 1 1 1
    3. 1 1 4 5 1 4
    4. 1 1 16 25 1 16
    5. 1 1 64 125 1 64
    6. 1 1 256 625 1 256
    7. 1 1 1024 3125 1 1024

    第二题:线性方程组

    方法一:我们可以利用左除符号“\”,对方程组进行直接求解:

    1. clc,clear,close all
    2. A = [2,5,-8;4,3,-9;2,3,-5;1,8,-7]
    3. B = [8,9,7,12]'
    4. x = A\B

    得出结果:

    1. x =
    2. 3.0000
    3. 2.0000
    4. 1.0000

    方法二:与左除同理,我们也可以用A的逆矩阵去乘B,然而A是非方阵,非方阵是没有逆矩阵的,但是会存在一个广义逆(也称伪逆),用pinv()函数求得,同样可以帮助我们解决问题:

    1. clc,clear,close all
    2. A = [2,5,-8;4,3,-9;2,3,-5;1,8,-7]
    3. B = [8,9,7,12]'
    4. x = pinv(A)*B

    得出结果:

    1. x =
    2. 3.0000
    3. 2.0000
    4. 1.0000

    方法三:我们也可以使用linsolve()函数对方程组进行直接求解:

    1. clc,clear,close all
    2. A = [2,5,-8;4,3,-9;2,3,-5;1,8,-7]
    3. B = [8,9,7,12]'
    4. x = linsolve(A,B)

    同样可以得出结果:

    1. x =
    2. 3.0000
    3. 2.0000
    4. 1.0000

    (如有错误或改进建议欢迎联系作者)

  • 相关阅读:
    java第三讲:数组(Array)
    web前端——HTML
    react hook: useLayoutEffect
    机器学习 天气识别
    三步写出一篇思路清晰的技术文章
    Revit二次开发-WPF ProgressBar 执行程序中显示进度条
    【PX4&Simulink&Gazebo联合仿真】在Simulink中使用ROS2控制无人机进入Offboard模式起飞悬停并在Gazebo中可视化
    聊天页面样式
    无论有没有按钮,iPhone都可以进行截屏操作!如何在iPhone上截屏
    wget 下载盯盘文件
  • 原文地址:https://blog.csdn.net/qq_69383479/article/details/132643030