【datawhale组队学习】数学建模chp01解析方法与几何模型

发布于:2025-06-20 ⋅ 阅读:(27) ⋅ 点赞:(0)

向量表示法与几何建模经典案例

几何模型中充斥了不同的数学关系,根据关系的分类可以把它们分为位置关系和数量关系两种。
位置关系就包括平行、垂直、异面、相交等,
数量关系则是需要具体求解边长、角度、面积等。

分析几何问题,在现在这个阶段我们所掌握的方法大体上可以分为三种:
传统几何的演绎-证明体系:这种体系下的方法都是基于已经被证明了的公理与定理体系(例如勾股定理、正弦定理、圆幂定理等),在解决问题的过程中更强调分析而非计算,往往是通过构造辅助线、辅助平面等利用严密的逻辑推理步步为营推导出最后的结果。这种方法往往分析起来会更加困难,但减少了计算量。
基于向量的计算化几何:向量被引入几何当中最初的目的是为了表示有向线段,但后来大家发现基于向量的一些运算特性可以把一些数量问题统一化。几何图形中的边长、角度、面积可以转化为向量的模长、内积等求解,平行、垂直等可以转化为向量共线、内积为0等求解,就可以把所有几何问题都变成可计算的问题。这样的方法更加重视计算,并且除了传统的几何向量外,还可以构造直角坐标系从而获得坐标向量,运算更加方便。
基于极坐标与方程的解析几何:这种方法其实可以回溯到当初学圆锥曲线的时期,把几何图形的相交、相切、相离抽象成方程解的问题。后来又学习过极坐标和参数方程,就会发现利用极坐标和参数方程去表示曲线实在是太方便了。这样的方法就可以把几何问题转化成一个代数问题来求解,大大提高了求解的效率。

在这里插入图片描述
在这里插入图片描述

向量表示与坐标变换

引入向量的目的:引入向量的目的并不仅仅是为了在几何图形中更好地表示方向和距离,而是为了利用代数的方法来解决几何问题。向量提供了一种将几何概念转化为代数表达式的方式,从而使得几何问题的解决变得更加简单和直接
解析几何法的本质就是利用函数与方程来表示不同的几何曲线。解析几何方法的本质就是把各种几何问题都转化为代数问题求解。解方程比起复杂的分析,更依靠计算…

二维坐标系中的旋转
如果我们要将坐标系绕原点旋转一个角度,就可以通过旋转矩阵来实现。
可以将原始坐标系中的点通过线性变换映射到新坐标系中。对于逆时针旋转,二维旋转矩阵的形式是
在这里插入图片描述
在三维空间中,物体的旋转可以围绕三个主轴进行:x轴, y轴和z轴。这些轴旋转代表了不同方向的运动,并且可以通过旋转矩阵来数学描述。
在这里插入图片描述
在这里插入图片描述

欧拉角

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Numpy与线性代数

在Numpy中,向量和矩阵都可以用二维数组表示

import numpy as np
# 创建向量
vector = np.array([1, 2, 3])
# 创建矩阵
matrix = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

在NumPy中,我们可以利用数组的广播机制来进行各种线性代数运算。例如,你可以轻松地将一个标量与一个向量或矩阵相乘,而不需要编写任何循环。NumPy也提供了计算矩阵的转置、行列式、逆矩阵等常见操作的函数。

## 使用numpy进行线性代数基本运算

import numpy as np
# 数量乘法示例
scalar = 5
scaled_vector = scalar * vector
print("Scaled vector:", scaled_vector)
# Scaled vector: [ 5 10 15]

# 矩阵的转置示例
transposed_matrix = matrix.T
print("Transposed matrix:\n", transposed_matrix)

# 计算行列式示例
matrix_determinant = np.linalg.det(matrix)
print("Matrix determinant:", matrix_determinant)

# 求解线性方程组示例
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
solution = np.linalg.solve(A, b)

numpy.linalg的使用

含了一系列关于线性代数的函数。无论是求解方程组,还是计算特征值、特征向量,乃至执行奇异值分解,linalg 模块都能够提供帮助。

平面几何模型的构建

单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀速直线传播,在不同界面上产生反射,利用这一原理,从测量船换能器垂直向海底发射声波信号,并记录从声波发射到信号接收的传播时间,通过声波在海水中的传播速度和传播时间计算出海水的深度,其工作原理如图 4 所示。由于单波束测深过程中采取单点连续的测量方法,因此,其测深数据分布的特点是,沿航迹的数据十分密集,而在测线间没有数据。多波束测深系统是在单波束测深的基础上发展起来的,该系统在与航迹垂直的平面内一次能发射出数十个乃至上百个波束,再由接收换能器接收由海底返回的声波,多波束测深系统克服了单波束测深的缺点,在海底平坦的海域内,能够测量出以测量船测线为轴线且具有一定宽度的全覆盖水深条带。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

立体几何问题的构建

使用Python解方程和方程组

from sympy import symbols, solve, nonlinsolve

x, y = symbols('x y')
print(solve(x * 2 - 2, x))  # 解方程2x - 2 = 0
# [1]

print(solve([x + y - 35, x * 2 + y * 4 - 94], x, y))  # 解方程组x + y = 35, 2x + 4y = 94
# {x:23, y:12}

print(solve(x**2 + x - 20, x))  # 解方程x^2 + x - 20 = 0
# [-5, 4]

a, b, c, d = symbols('a b c d', real=True)
print(nonlinsolve([a**2 + a + b, a - b], [a, b]))  # 解非线性方程组a^2 + a + b = 0, a - b = 0
# {(-2, -2), (0, 0)}
from sympy import symbols, cos, sin, pi, nonlinsolve
import numpy as np
x, y, theta = symbols('x y theta', real=True)
L1, L2, L3 = 3, 3, 3
p1, p2, p3 = 5, 5, 3
x1, x2, y2 = 5, 0, 6
# 计算内角β
b = np.arccos((L2**2 + L3**2 - L1**2) / (2 * L2 * L3))
print(b)
# 尝试解方程组
solution = nonlinsolve([
    (x + L3 * cos(theta) - x1)**2 + (y + L3 * sin(theta))**2 - p1**2,
    x**2 + y**2 - p2**2,
    (x + L2 * cos(pi/3 + theta))**2 + (y + L2 * sin(pi/3 + theta) - y2)**2 - p3**2
], [x, y, theta])
print(solution)
# 1.0471975511965979

没有找到方程的解析解,转向数值解法,特别是Scipy库中的fsolve函数,来找到方程组的数值解。以下是使用fsolve的案例:

from scipy.optimize import fsolve
from math import sin, cos, pi
# 定义方程组
def equations(vars):
    x, y, theta = vars
    L1, L2, L3 = 3, 3, 3
    p1, p2, p3 = 5, 5, 3
    x1, x2, y2 = 5, 0, 6
    # 根据问题描述定义的方程
    eq1 = (x + L3*cos(theta) - x1)**2 + (y + L3*sin(theta))**2 - p2**2
    eq2 = x**2 + y**2 - p1**2
    eq3 = (x + L2*cos(pi/3 + theta))**2 + (y + L2*sin(pi/3 + theta) - y2)**2 - p3**2
    return [eq1, eq2, eq3]
# 初始猜测值
initial_guess = [-1.37, 4.80, 0.12]
# 使用fsolve求解方程组
result = fsolve(equations, initial_guess)
print(result)
# [1.15769945 4.86412705 0.02143414]

上面的代码中,equations 函数定义了一个方程组,它接受一个变量列表(在这里是 x, y, 和 theta),然后返回一个方程组列表。然后,我们使用 fsolve 来求解这个方程组,并且提供了一个初始猜测值列表 initial_guess。fsolve 会尝试找到这些方程的根,这意味着它会寻找满足方程组为零的 x, y, 和 theta 的值。

在 Scipy 库中,除了 fsolve,还有其他几个函数可以用于解决类似的问题,比如:

brentq 或 bisection:这些函数是用于求解单变量方程的根的,适用于在指定区间内具有一个根的情况。
root:这个函数提供了一个更加通用的接口来求解多变量方程组的根,它允许选择不同的算法,比如 hybr, lm, broyden1, 等等。
newton:用于求解单变量方程的根,当你有方程的导数信息时特别有用

https://space.bilibili.com/400365390/lists/3616962?type=season


网站公告

今日签到

点亮在社区的每一天
去签到