【数学建模学习笔记【集训十天】之第七天】


Numpy 学习(续)

矩阵运算与线性代数

# -*- coding = utf-8 -*-
# @Time : 2022/7/4 9:52
# @Author : lxw_pro
# @File : Numpy库学习-3.py
# @Software : PyCharm

# 矩阵运算与线性代数

# Python中的线性代数运算主要使用numpy.linalg模块,其常用函数如下:
'''
函数              说明
norm            求向量或矩阵的范数
inv             求矩阵的逆阵
pinv            求矩阵的广义逆阵
solve           求解线性方程组
det             求矩阵的行列式
lstsq           最小二乘法求解超定线性方程组
eig             求矩阵的特殊值和特殊向量
eigvals         求矩阵的特殊值
svd             矩阵的奇异值分解
qr              矩阵的QR分解

'''

# 范数计算
'''
计算范数的函数norm的调用格式:
norm(x, ord=None, axis=None, keepdims=False)

参数说明
参数              描述
x       表示要度量的向量或矩阵
ord     表示范数的种类,例如1范数、2范数等
axis:   axis=0表示按列向量处理,求多个列向量的范数;
        axis=1表示按行向量处理,求多个行向量的范数
        axis=None表示矩阵范数
keepdims    是否保持矩阵的二维特性【True / False】

'''


求范数

题目描述

求下列矩阵的各个行向量的2范数,各个列向量的2范数和矩阵2范数

在这里插入图片描述



import numpy as np
jz = np.array([
    [0, 3, 4],
    [1, 6, 4]
])                              # 矩阵

h = np.linalg.norm(jz, axis=1)  # 求行向量2范数
l = np.linalg.norm(jz, axis=0)  # 求列向量2范数
f = np.linalg.norm(jz)          # 求矩阵2范数

print(f"行向量2范数为{np.round(h, 4)}")
# 运行结果为:行向量2范数为[5.     7.2801]

print(f"列向量2范数为{np.round(l, 4)}")
# 运行结果为:列向量2范数为[1.     6.7082 5.6569]

print(f"矩阵2范数为{round(f, 4)}")
# 运行结果为:矩阵2范数为8.8318



求解线性方程组的唯一解

题目描述:求线性方程组
在这里插入图片描述

import numpy as np
a = np.array([
    [3, 1],
    [1, 2]
])
b = np.array([9, 8])
# 解法1:
x = np.linalg.inv(a) @ b
print(x)    # 输出 [2. 3.]    表示x=2, y=3

# 解法2:
x2 = np.linalg.solve(a, b)
print(x2)   # 输出 [2. 3.]    表示x=2, y=3



求超定线性方程组的最小二乘解

题目描述:求解线性方程组
在这里插入图片描述

import numpy as np
m = np.array([
    [3, 1],
    [1, 2],
    [1, 1]
])
n = np.array([9, 8, 6])
x = np.linalg.pinv(m) @ n
print("最小二乘解为:{}".format(np.round(x, 4)))
# 运行结果为:最小二乘解为:[2.     3.1667]



求特殊值及特殊向量

题目描述: 求下列矩阵的特征值和特征向量
在这里插入图片描述

import numpy as np
q = np.eye(4)
w = np.rot90(q)

z, x = np.linalg.eig(w)
print("特征值为:", z)   # 输出  特征值为: [ 1. -1.  1. -1.]
print("特征向量为:\n", x)

运行结果如下:

在这里插入图片描述


SciPy 学习(续)

SciPy 优化器

SciPy 的 optimize 模块提供了常用的最优化算法函数实现,我们可直接调用这些函数完成我们的优化问题

我们可以使用 SciPyoptimze.root 函数,这个函数需要两个参数:

  • fun - 表示方程的函数
  • x0 - 根的初始猜测

查找 x + cos(x) 方程的根


from scipy.optimize import root
from math import cos


def gen(x):
    return x+cos(x)


myroot = root(gen, 0)
print(myroot.x)     # 输出 [-0.73908513]
# 查看更多信息:
print(myroot)
运行 结果如下:

在这里插入图片描述


最小化函数

可以使用 scipy.optimize.minimize() 函数来最小化函数

x^2 + x + 2 使用 BFGS 的最小化函数

'''
minimize() 函接受以下几个参数:

fun - 要优化的函数

x0 - 初始猜测值

method - 要使用的方法名称,值可以是:'CG','BFGS','Newton-CG','L-BFGS-B','TNC','COBYLA',,'SLSQP'。

callback - 每次优化迭代后调用的函数

options - 定义其他参数的字典

'''


# x^2 + x + 2 使用 BFGS 的最小化函数
from scipy.optimize import minimize

def zxh(x):
    return x ** 2+x+2


mymin = minimize(zxh, 0, method='BFGS')
print(mymin)

运行结果如下:

在这里插入图片描述


SciPy Matlab 数组

NumPy 提供了 Python 可读格式的数据保存方法


'''
SciPy 提供了与 Matlab 的交互的方法
SciPy 的 scipy.io 模块提供了很多函数来处理 Matlab 的数组

以 Matlab 格式导出数据
savemat() 方法可以导出 Matlab 格式的数据。

'''


from scipy import io
import numpy as np

lxw = np.array([5, 2, 0, 1, 3, 1, 4])

io.savemat('lxw.mat', {'vec': lxw})     # 导出

# 注:上面的程序代码会生成一个mat文件


导入 Matlab 格式数据

loadmat() 方法可以导入 Matlab 格式数据

# 该方法参数:
# filename - 保存数据的文件名
from scipy import io
import numpy as np

lxw2 = np.array([6, 2, 9, 1, 4, 5])

io.savemat('lxw2.mat', {'vec': lxw2})   # 导出

mydata = io.loadmat('lxw2.mat')         # 导入
print(mydata)
# 注:返回一个结构化数组,其键是变量名,对应的值是变量值

# 使用变量名 "vec" 可显示 matlab 数据的数组
print(mydata['vec'])    # 输出 [[6 2 9 1 4 5]]

上面结果变成了二维,须squeeze_me利用降维

mydata2 = io.loadmat('lxw2.mat', squeeze_me=True)
print(mydata2['vec'])   # 输出 [6 2 9 1 4 5]

Matplotlib 学习(续)

Matplotlib 绘图线

线的类型

‘dashed’【‘–’】 破折线【运用】
# Matplotlib 绘图线

# 线的类型
# 线的类型可以使用 linestyle 参数来定义【简写为 ls】
'''
类型	            简写	    说明
'solid' (默认)	'-'	    实线
'dotted'	    ':'	    点虚线
'dashed'	    '--'	破折线
'dashdot'	    '-.'	点划线
'None'	    '' 或 ' '	画线

'''

# 'dashed'【'--'】    	破折线
import matplotlib.pyplot as plt
import numpy as np

lx = np.array([23, 12, 43, 29])

plt.plot(lx, linestyle='dashed')

plt.show()

运行效果如下:

在这里插入图片描述


‘-.’【dashdot】 点划线【运用】
# 使用简写:
# '-.'【dashdot】         点划线
from matplotlib import pyplot as plt
import numpy as np

lx2 = np.array([23, 54, 12, 5])

plt.plot(lx2, ls='-.')

plt.show()


运行效果如下:

在这里插入图片描述


线的颜色

红色:

# 线的颜色
# 线的颜色可以使用 color 参数来定义,简写为 c
import matplotlib.pyplot as plt
import numpy as np

ys = np.array([23, 12, 43, 12, 43, 21])

plt.plot(ys, color='r')
plt.show()

运行效果如下:

在这里插入图片描述


绿色

# 绿色
plt.plot(ys, c='#8FBC8F')
plt.show()
运行效果如下:

在这里插入图片描述


深绿色

# 深绿色
plt.plot(ys, c='SeaGreen')
plt.show()
运行效果如下:

在这里插入图片描述


线的宽度

# 线的宽度
# 线的宽度可以使用 linewidth 参数来定义,简写为 lw
import matplotlib.pyplot as plt
import numpy as np

kd = np.array([12, 23, 5, 12])

plt.plot(kd, linewidth='6.6')
plt.show()

运行效果如下:

在这里插入图片描述


多条线

# 多条线
# plot() 方法中可以包含多对 x,y 值来绘制多条线
import matplotlib.pyplot as plt
import numpy as np

d1 = np.array([12, 3, 23, 9])
d2 = np.array([6, 14, 8, 23])

plt.plot(d1)
plt.plot(d2)

plt.show()

运行效果如下:

在这里插入图片描述


更多线

import matplotlib.pyplot as plt
import numpy as np

x1 = np.array([1, 2, 3, 6])
y1 = np.array([3, 6, 9, 2])
x2 = np.array([5, 2, 0, 8])
y2 = np.array([6, 2, 9, 3])

plt.plot(x1, y1, x2, y2)
plt.show()

运行效果如下:

在这里插入图片描述


上一章链接:【数学建模学习笔记【集训十天】之第六天】


每日一言:

有些往事只能回味,眼前的生活要向前看,不是所有的人或事都停留在一瞬,只有经历了才会明白这世界的规则或安定!


持续更新中…

在这里插入图片描述

评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值