文章目录
- 解析几何与方程模型
- 1.几何建模思想
- 2.Numpy在线性代数中的使用
- 3.国赛求解
- 3.1题目
- 3.2 问题1求解
- 建立模型
- 代码求解
- 3.3 问题2求解
- 4.问题答疑
- Q1:什么是行列式,其使用场景是什么
- 行列式的定义
- 行列式的性质
- 行列式的使用场景
- Q2:2023B题问题一用相似三角形求解覆盖宽度 W W W
- 5.学习感想
- 6.疑问
解析几何与方程模型
写在最前,该读书笔记为参加DataWhale 202406 数学建模导论 所写。
项目github:https://github.com/datawhalechina/intro-mathmodel/tree/main
1.几何建模思想
分析几何问题有如下三种方法:
- 传统几何的演绎-证明体系:这种体系下的方法都是基于已经被证明了的公理与定理体系(例如勾股定理、正弦定理、圆幂定理等),在解决问题的过程中更强调分析而非计算,往往是通过构造辅助线、辅助平面等利用严密的逻辑推理步步为营推导出最后的结果。这种方法往往分析起来会更加困难,但减少了计算量。
- 基于向量的计算化几何:向量被引入几何当中最初的目的是为了表示有向线段,但后来大家发现基于向量的一些运算特性可以把一些数量问题统一化。几何图形中的边长、角度、面积可以转化为向量的模长、内积等求解,平行、垂直等可以转化为向量共线、内积为0等求解,就可以把所有几何问题都变成可计算的问题。这样的方法更加重视计算,并且除了传统的几何向量外,还可以构造直角坐标系从而获得坐标向量,运算更加方便。
- 基于极坐标与方程的解析几何:这种方法其实可以回溯到当初学圆锥曲线的时期,把几何图形的相交、相切、相离抽象成方程解的问题。后来又学习过极坐标和参数方程,就会发现利用极坐标和参数方程去表示曲线实在是太方便了。这样的方法就可以把几何问题转化成一个代数问题来求解,大大提高了求解的效率。
2.Numpy在线性代数中的使用
直接跟教程敲了一遍python代码,如下:
import numpy as np
def create():
# 创建向量
vector = np.array([1,2,3])
print(vector)
print(vector.shape)
#创建矩阵
matrix = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(matrix)
print(matrix.shape)
#索引
print(vector[0])
print(matrix[1,1])
#切片
print(vector[0:2])
print(matrix[0:2,0:2])
#向量加法
vector1 = np.array([1,2,3])
vector2 = np.array([4,5,6])
print(np.add(vector1,vector2))
print(np.add(vector1[1],vector2[2]))
#矩阵乘法
matrix1 = np.array([[1,2],[3,4]])
matrix2 = np.array([[5,6],[7,8]])
print(np.dot(matrix1,matrix2))
#数量乘法
scalar = 5
scaled_vector = scalar*vector
print("Scaled vector",scaled_vector)
#矩阵的转置示例
transposed_matrix = matrix.T
print("Transposed_matrix:\n",transposed_matrix)
#计算行列式示例
matrix_determinant = np.linalg.det(matrix)
print("Matrix determinant:",matrix_determinant)
#Q:行列式的定义,以及使用场景
# 求解线性方程组
A = np.array([[3,1],[1,2]])
b = np.array([9,8])
solution = np.linalg.solve(A,b)
print("Solution of the linear system:",solution)
# numpy.linalg
# 计算逆矩阵
pseudo_inverse_matrix = np.linalg.pinv(matrix)
print("Pseudo-inverse of the matrix:")
print(pseudo_inverse_matrix)
# 特征值和特征向量
eigenvalues,eigenvectors = np.linalg.eig(matrix)
print(eigenvalues)
print(eigenvectors)
# 奇异值分解
U,S,V = np.linalg.svd(matrix)
print(U)
print(S)
print(V)
# 范数计算
norm = np.linalg.norm(vector)
print(norm)
if __name__ == '__main__':
create()
3.国赛求解
2023高教社杯全国大学生数学建模竞赛B题
3.1题目
3.2 问题1求解
建立模型
代码求解
import numpy as np
from scipy.optimize import fsolve
# 常量定义
theta = 2 * np.pi / 3 # 全开角
alpha = 1.5 / 180 * np.pi # 海底坡度
htheta = theta / 2 # 半开角
h = 70 # 中心点的海水深度
d = 200 # 测线距离
k = np.tan(np.pi / 2 - htheta) # 超声波直线的斜率
k0 = np.tan(alpha) # 海底斜率
# 初始化
Aleft = [] # 左端点坐标
Aright = [] # 右端点坐标
Acenter = [] # 中心点坐标
W = [] # 覆盖宽度
# 求解交点
for n in range(-4, 5):
leftsolve = lambda t: k * (t - n * d) - k0 * t + h
rightsolve = lambda t: -k * (t - n * d) - k0 * t + h
tleft = fsolve(leftsolve, 0)
tright = fsolve(rightsolve, 0)
Aleft.append([tleft[0], k0 * tleft[0] - h])
Aright.append([tright[0], k0 * tright[0] - h])
Acenter.append([200 * n, k0 * 200 * n - h])
Aleft = np.array(Aleft)
Aright = np.array(Aright)
Acenter = np.array(Acenter)
D = Acenter[:, 1] # 海水深度
W = np.sqrt((Aleft[:, 0] - Aright[:, 0]) ** 2 + (Aleft[:, 1] - Aright[:, 1]) ** 2) # 覆盖宽度
# 计算重合部分
cover = np.zeros(8)
for i in range(8):
cover[i] = np.sqrt((Aright[i, 0] - Aleft[i + 1, 0]) ** 2 + (Aright[i, 1] - Aleft[i + 1, 1]) ** 2)
eta = cover / W[1:]
# 打印结果
print("海水深度 D:", D)
# 海水深度 D: [-90.94873726 -85.71155294 -80.47436863 -75.23718431 -70.
# -64.76281569 -59.52563137 -54.28844706 -49.05126274]
print("覆盖宽度 W:", W)
# 覆盖宽度 W: [315.81332829 297.62756059 279.44179288 261.25602517 243.07025746
# 224.88448975 206.69872205 188.51295434 170.32718663]
print("重合部分比例 eta:", eta)
# 重合部分比例 eta: [0.35695443 0.31510572 0.26743092 0.21262236 0.14894938 0.07407224
# 0.01525164 0.12364966]
3.3 问题2求解
4.问题答疑
Q1:什么是行列式,其使用场景是什么
行列式(Determinant)是线性代数中的一个重要概念,它是一个方阵(即行数与列数相等的矩阵)对应的一个标量值。行列式具有许多重要的性质和应用场景。以下是行列式的定义以及一些主要的使用场景。
行列式的定义
对于一个 n × n n \times n n×n的方阵 A A A,行列式 det ( A ) \text{det}(A) det(A)可以递归定义如下:
- 1x1矩阵的行列式:
det ( A ) = a 11 \text{det}(A) = a_{11} det(A)=a11 - 2x2矩阵的行列式:
det ( A ) = a 11 a 22 − a 12 a 21 \text{det}(A) = a_{11}a_{22} - a_{12}a_{21} det(A)=a11a22−a12a21 - nxn矩阵的行列式:
det ( A ) = ∑ j = 1 n ( − 1 ) 1 + j a 1 j det ( A 1 j ) \text{det}(A) = \sum_{j=1}^{n} (-1)^{1+j} a_{1j} \text{det}(A_{1j}) det(A)=j=1∑n(−1)1+ja1jdet(A1j)
其中, A 1 j A_{1j} A1j表示从矩阵 A A A中去掉第1行和第j列后得到的 ( n − 1 ) × ( n − 1 ) (n-1) \times (n-1) (n−1)×(n−1)子矩阵。这个定义可以推广到更高维的矩阵,称为递归定义。
行列式的性质
- 行列式的乘法性质:如果
A
A
A和
B
B
B是两个
n
×
n
n \times n
n×n的矩阵,则
det ( A B ) = det ( A ) ⋅ det ( B ) \text{det}(AB) = \text{det}(A) \cdot \text{det}(B) det(AB)=det(A)⋅det(B) - 行列交换的影响:交换矩阵的两行,行列式的值取反。
- 行列等价变换:若矩阵的某行加上另一行的倍数,则行列式的值不变。
- 行列重复:如果矩阵有两行相同,则行列式的值为0。
- 三角矩阵的行列式:对于上三角矩阵或下三角矩阵,其行列式为对角线上元素的乘积。
行列式的使用场景
- 求解线性方程组:使用行列式和Cramer法则可以求解线性方程组。例如,对于线性方程组 A X = B AX = B AX=B,如果 det ( A ) ≠ 0 \text{det}(A) \neq 0 det(A)=0,则方程组有唯一解。
- 矩阵的可逆性判断:一个矩阵 A A A是可逆的当且仅当 det ( A ) ≠ 0 \text{det}(A) \neq 0 det(A)=0。
- 特征值与特征向量:行列式用于计算矩阵的特征值,通过解特征方程 det ( A − λ I ) = 0 \text{det}(A - \lambda I) = 0 det(A−λI)=0可以找到矩阵 A A A的特征值 λ \lambda λ。
- 面积和体积计算:在几何学中,行列式可以用于计算多边形的面积和多面体的体积。例如,平面上两个向量的行列式的绝对值等于这两个向量张成的平行四边形的面积。
- 变换的雅可比行列式:在多变量微积分中,变换的雅可比行列式用于描述变换在不同点的局部伸缩和旋转性质。
行列式在数学的多个领域都有广泛应用,包括线性代数、微积分、几何学和数值分析等。理解行列式及其性质,对于深入学习和应用这些领域的知识是非常重要的。
Q2:2023B题问题一用相似三角形求解覆盖宽度 W W W
按照我的思维,要求解测线距离中心点不同距离下的覆盖宽度,就要分多次代值计算。但是马哥在求解时候使用了三角形相似,对应边长成比例的方法,得出以下等式:
W
′
D
+
d
tan
α
=
W
D
.
(1.3.10)
\frac{W'}{D + d \tan\alpha} = \frac{W}{D}. \tag{1.3.10}
D+dtanαW′=DW.(1.3.10)
因为测线距离
d
d
d、海底倾角
a
l
p
h
a
alpha
alpha、前一段测线的覆盖宽度
W
W
W和前一段测线距海底高度
D
D
D已知,直接替换d即可求出前一段测线和本测线的覆盖宽度
W
′
W'
W′。
5.学习感想
距离上一次数据建模还是在上一次。初次看国赛题目觉得就是高考第17题,求解多边形之间的关系,上手做题时脑袋抽了,各种定理忘得七七八八,一度怀疑高考时才是我的巅峰水准(=-=),硬着头皮把各种证明定理捡起来,勉强能理解整个建模过程。
对比自己建模写的解题思路,马哥写得条理清晰,有序地建立各条公式,且最后解题的到答案时,还会分析结果,让读者更信服模型的可靠性及答案的真实性。这是一个值得我学习的闪光点(当年某人直接算出结果就提交了==)
之前建模解答都是使用matlab求解答案,在今次学习过程中接触到python的一些常用库,如:Numpy、Sympy、Scipy。
6.疑问
1、公式1.4.4是否有误
2、文档中指出平面BEC是平行于水平面IGHF。
已和马哥沟通,“平面BEC是平行于水平面IGHF”改为“平面BEC是平行于水平面”