以下为个人学习笔记和习题整理
课程:Python 数学建模
教材:Python 数学实验与建模 司守奎 孙玺菁 编著
本作业为对应教材中的习题,持续施工中...
# 第二章 数据处理与可视化
# 习题 2.8
在同一个图形界面中分别画出 6 条曲线
解答
import numpy as np | |
import matplotlib.pyplot as plt | |
x = np.linspace(-10 * np.pi, 10 * np.pi, 10000) | |
k = range(1, 7) | |
plt.rc('font', size=16) | |
plt.rc('text', usetex=True) | |
plt.title('$y=kx^2sin(x)+2k+cos(x^3)$') | |
for i in k: | |
y = i * x ** 2 * np.sin(x) + 2 * i + np.cos(x ** 3) | |
plt.plot(x, y, label='k={}'.format(i)) | |
plt.legend() | |
plt.show() |
# 习题 2.9
把屏幕开成 2 行 3 列 6 个子窗口,每个子窗口画一条曲线,画出曲线
解答
import numpy as np | |
import matplotlib.pyplot as plt | |
x = np.linspace(-10 * np.pi, 10 * np.pi, 10000) | |
k = range(1, 7) | |
for i in k: | |
ax = plt.subplot(2, 3, i) | |
y = i * x ** 2 * np.sin(x) + 2 * i + np.cos(x ** 3) | |
ax.plot(x,y,'r',label='k={}'.format(i)) | |
plt.legend() | |
plt.show() |
# 习题 2.10
分别画出下列二次曲面
- 单叶双曲面
- 双叶双曲面
- 椭圆抛物面
解答
from sympy.plotting import plot3d | |
from sympy.abc import x, y | |
from sympy.functions import sqrt | |
plot3d(sqrt(6 / 8 * x ** 2 + 6 / 10 * y ** 2 - 6), (x, -10, 10), (y, -10, 10)) |
from sympy.plotting import plot3d | |
from sympy.abc import x, y | |
from sympy.functions import sqrt | |
plot3d(sqrt(x ** 2 - 8 / 12 * y ** 2 - 8), (x, -10, 10), (y, -10, 10)) |
from sympy.plotting import plot3d | |
from sympy.abc import x, y | |
plot3d(x ** 2 / 10 + y ** 2 / 6, (x, -10, 10), (y, -10, 10)) |
# 习题 2.11
默比乌斯带是一种拓扑学结构,它只有一个面和一个边界,是 1858 年由德国数学家、天文学家默比乌斯和约翰・李斯丁独立发现的.其参数方程为
其中,.绘制默比乌斯带.
解答
import matplotlib.pyplot as plt | |
import numpy as np | |
ax = plt.axes(projection='3d') | |
t = np.linspace(0, 2 * np.pi, 1000) | |
s = np.linspace(-1, 1, 1000) | |
S, T = np.meshgrid(s, t) | |
X = (2 + S / 2 * np.cos(T / 2)) * np.cos(T) | |
Y = (2 + S / 2 * np.cos(T / 2)) * np.sin(T) | |
Z = S / 2 * np.sin(T / 2) | |
ax.plot_surface(X, Y, Z, cmap='viridis') | |
plt.show() |
# 第三章 Python 数学应用
# 习题 3.6
求解下列线性方程组
解答
import sympy as sp | |
def solve(A, b): | |
if b == sp.zeros(b.shape[0], b.shape[1]): # 齐次方程 | |
print("基础解系为:", A.nullspace()) | |
else: # 非齐次方程 | |
n = A.shape[1] # 未知数个数 | |
C = A.row_join(b) # 构造增广矩阵 | |
c = C.rref()[1] # 主元列 | |
C = C.rref()[0] | |
print("通解为:") | |
k = 1 | |
for i in range(n): | |
if i not in c: | |
M = C[0:len(c), i] | |
M = -M | |
t = sp.zeros(n - len(c), 1) | |
t[k - 1] += 1 | |
for j in range(len(c)): | |
t = t.row_insert(c[j], M.row(j)) | |
print('c' + str(k) + ' *', t, '+ ', end='') | |
k += 1 | |
M = C[0:len(c), -1] | |
t = sp.zeros(n - len(c), 1) | |
for j in range(len(c)): | |
t = t.row_insert(c[j], M.row(j)) | |
print(t) | |
if __name__ == '__main__': | |
A1 = sp.Matrix([[1, 2, 1, -1], [3, 6, -1, -3], [5, 10, 1, -5]]) | |
b1 = sp.Matrix([0, 0, 0]) | |
b1.transpose() | |
A2 = sp.Matrix([[2, 1, -1, 1], [4, 2, -2, 1], [2, 1, -1, -1]]) | |
b2 = sp.Matrix([1, 2, 1]) | |
solve(A1, b1) | |
solve(A2, b2) |
# 习题 3.7
先判断下列线性方程组解的情况,然后求对应的唯一解、最小二乘解或最小范数解
解答
import numpy as np | |
import numpy.linalg as LA | |
def solve(A, b): | |
RA = LA.matrix_rank(A) | |
C = np.append(A, b, axis=1) # 增广阵 | |
# print(C) | |
RAb = LA.matrix_rank(C) | |
if RA < RAb: | |
print("无解,最小二乘解为:", LA.pinv(A).dot(b)) | |
elif RA == A.shape[1]: | |
print("有唯一解:", LA.solve(A, b)) | |
else: | |
print("有多解,最小范数解为:", LA.pinv(A).dot(b)) | |
if __name__ == '__main__': | |
A1 = np.array([[4, 2, -1], [3, -1, 2], [11, 3, 0]]) | |
b1 = np.array([[2, 10, 8]]) | |
b1 = b1.reshape(3, 1) | |
A2 = np.array([[2, 3, 1], [1, -2, 4], [3, 8, -2], [4, -1, 9]]) | |
b2 = np.array([[4, -5, 13, -6]]) | |
b2 = b2.reshape(4, 1) | |
solve(A1, b1) | |
solve(A2, b2) |
# 第四章 概率论与数理统计
# 习题 4.1
一家工厂生产的某种元件的寿命 X(以 h 计)服从均值,标准差 的正态分布,若要求,允许 最大为多少?
解答
from scipy.stats import norm | |
from scipy.optimize import fsolve | |
f = lambda sigma: norm.cdf(200, 160, sigma) - norm.cdf(120, 160, sigma) - 0.8 | |
print("sigma=", fsolve(f, 10)) |
# 附:Windows 系统 Python 数学建模环境安装
# 安装 PyCharm
安装 PyCharm Professional 或者先安装 Toolbox
谁能拒绝 JetBrains 啊快跟我一起下 Toolbox
# 安装 Toolbox
Windows 系统从 Toolbox 官网下载 exe 安装包并安装
点击进入JetBrains Toolbox官网下载界面
# 修改 Toolbox 默认安装路径
当前时间下从 Toolbox 的设置中,发现下载路径是只读不可修改
在路径 C:\Users\用户名\AppData\Local\JetBrains\Toolbox
下修改 .settings.json
文件增加安装路径:
"install_location": "E:\\JetBrains", |
注意符合json语法,例如:
{ | |
"install_location": "E:\\JetBrains", | |
"channel_rollback_max_history": 1, | |
"shell_scripts": { | |
"location": "C:\\Users\\用户名\\AppData\\Local\\JetBrains\\Toolbox\\scripts" | |
}, | |
"ui": { | |
"language": "zh-CN" | |
}, | |
"tools": { | |
"localize_tools": true | |
}, | |
"update": { | |
"install_automatically": false | |
} | |
} |
设置完成后,直接从 Toolbox 安装 PyCharm Professional
# 激活诀窍
点击进入网页下载jetbra.zip
打开上述网页后选择一个有效链接并进入,根据上方提示信息点击下载
jetbra.zip
文件解压后放在你想放的位置,运行
scripts
目录下 install-all-users.vbs
在之前的网站上找到对应软件,点击下方的
Copy to clipboard
按钮,并看到 Copied!
提示打开 IDE,粘贴激活码,呈绿色,此时可点击
Activate
激活安装中文语言包:未打开项目首页
Plugins
,或项目内 File-Settings-Plugins
,搜索 chinese
# 安装 conda
节省内存,可安装 miniconda
,下载 Python 3.10
版本的最新版
下载Windows installers
安装完成后,选择 miniconda3
文件夹属性,在安全标签中给当前用户完全控制权
(此步骤便于将虚拟环境置于 miniconda3
文件夹内部,若跳过此步骤将导致只能通过管理员权限新建虚拟环境)
# 配置环境
若 C 盘空间紧张,可打开 Anaconda Powershell Prompt(miniconda3)
程序,运行 conda info
查看 package cache
和 envs directories
的默认目录是否在 C 盘
如需修改此目录,可新建或修改用户目录下的 .condarc
文件,例如:
envs_dirs: | |
- E:\miniconda3\envs | |
pkgs_dirs: | |
- E:\miniconda3\pkgs |
可使用 PyCharm 新建 conda 环境:
安装 Python 包,可直接在 PyCharm 中打开终端,例如安装 numpy:
conda install numpy |