第1章:Python基础回顾

各位工程师朋友,咱们开始之前,我先说句实在话。做凸轮曲线设计,光会机械理论是不够的。你得会编程,得会用工具把想法快速验证出来。这一章,我就带你快速过一遍Python的基础环境配置和两个最常用的库。别担心,咱们不搞学院派那套,怎么实用怎么来。

1.1 Python环境配置——别在这卡住

我个人习惯用Anaconda来管理Python环境。为什么?因为省心。你想想看,搞凸轮设计要装NumPy、SciPy、Matplotlib这些库,一个一个装多麻烦。Anaconda一次性全给你打包好了。

安装步骤其实就三步:

  1. 去Anaconda官网下载对应系统的安装包
  2. 一路默认安装,记得勾选「Add Anaconda to my PATH environment variable」
  3. 打开终端或Anaconda Prompt,输入 python --version 验证
⚠️ 避坑指南: 我曾经遇到过学生装了Python 3.12,结果某个凸轮曲线库不兼容。建议用Python 3.8到3.10之间的版本,稳定。我现在自己用的是3.9.13。

装好之后,我建议你创建一个专门的项目环境。在终端里敲:

conda create -n cam_design python=3.9
conda activate cam_design
pip install numpy matplotlib scipy

嗯,这里要注意。每次打开新终端,记得先 conda activate cam_design。不然你装的库全白费。

1.2 NumPy快速入门——凸轮计算的核心

NumPy说白了就是Python里的数学引擎。咱们做凸轮曲线,位移、速度、加速度、跃度,全是数组运算。没有NumPy,你写个循环算1000个点,电脑得卡半天。

最常用的几个操作:

  • 创建数组: np.array([1,2,3])np.linspace(0, 2*np.pi, 1000)
  • 数学运算: 直接加减乘除,比如 s = a * t + b
  • 三角函数: np.sin(), np.cos() —— 凸轮曲线里天天用

举个例子,生成一个简单的正弦加速度曲线:

import numpy as np

theta = np.linspace(0, 2*np.pi, 1000)  # 凸轮转角,0到360度
s = 0.5 * (1 - np.cos(theta))          # 正弦加速度位移曲线

# 速度是位移的一阶导数
v = np.gradient(s, theta[1] - theta[0])
# 加速度是二阶导数
a = np.gradient(v, theta[1] - theta[0])

我在项目中遇到过一个问题:直接用 np.gradient 算导数,边界点会有误差。后来我改用中心差分法,边界用前向和后向差分,精度高不少。这个后面讲凸轮曲线评价时会细说。

💡 个人经验: 凸轮设计里,数组长度建议取1024或2048。为什么?因为FFT分析时这些长度效率最高。我一般用1024点,精度够用,计算也快。

1.3 Matplotlib快速入门——把曲线画出来

光有数据不行,你得看得见。Matplotlib就是干这个的。咱们做凸轮设计,位移曲线、速度曲线、加速度曲线,甚至极坐标下的凸轮轮廓,都得靠它可视化。

画图三板斧:

import matplotlib.pyplot as plt

# 1. 创建画布和子图
fig, ax = plt.subplots(figsize=(8, 4))

# 2. 画数据
ax.plot(theta, s, label='位移', linewidth=2)
ax.plot(theta, v, label='速度', linestyle='--')
ax.plot(theta, a, label='加速度', linestyle=':')

# 3. 加标签和网格
ax.set_xlabel('凸轮转角 (rad)')
ax.set_ylabel('值')
ax.legend()
ax.grid(True, alpha=0.3)

plt.show()

你想想看,如果不用Matplotlib,你只能看一堆数字。但画成图,一眼就能看出加速度有没有突变,有没有冲击。这就是可视化的价值。

🔑 核心要点: 凸轮曲线设计里,我习惯把位移、速度、加速度画在同一张图上,用不同线型区分。这样能直观看到运动规律是否平滑。加速度曲线如果有尖角,说明有冲击,得改曲线类型。

1.4 面向对象编程基础——把凸轮曲线封装起来

面向对象编程,说白了就是把数据和操作数据的方法打包在一起。咱们做凸轮设计,一个凸轮曲线有类型、有参数、有计算方法。用类来管理,比写一堆散乱的函数强多了。

一个简单的凸轮曲线类:

class CamCurve:
    """凸轮曲线基类"""
    def __init__(self, name, start_angle, end_angle, lift):
        self.name = name
        self.start_angle = start_angle
        self.end_angle = end_angle
        self.lift = lift
        self.theta = None
        self.s = None
        self.v = None
        self.a = None
    
    def calculate(self, num_points=1000):
        """计算位移、速度、加速度——子类实现"""
        raise NotImplementedError("子类必须实现此方法")
    
    def plot(self):
        """绘制曲线"""
        if self.theta is None:
            print("请先调用 calculate() 方法")
            return
        plt.figure(figsize=(8, 4))
        plt.plot(self.theta, self.s, label='位移')
        plt.plot(self.theta, self.v, label='速度')
        plt.plot(self.theta, self.a, label='加速度')
        plt.legend()
        plt.grid(True)
        plt.title(f'{self.name} 曲线')
        plt.show()


class SineAccelCurve(CamCurve):
    """正弦加速度曲线"""
    def calculate(self, num_points=1000):
        self.theta = np.linspace(self.start_angle, self.end_angle, num_points)
        beta = self.end_angle - self.start_angle
        # 正弦加速度位移公式
        self.s = self.lift * (self.theta / beta - np.sin(2*np.pi*self.theta/beta) / (2*np.pi))
        self.v = np.gradient(self.s, self.theta[1] - self.theta[0])
        self.a = np.gradient(self.v, self.theta[1] - self.theta[0])

用的时候很简单:

curve = SineAccelCurve("推程正弦加速度", 0, np.pi, 50)
curve.calculate()
curve.plot()
⚠️ 避坑指南: 我曾经犯过一个错误——把凸轮曲线的所有方法都写在一个大函数里。后来要加新的曲线类型,改得我头皮发麻。用面向对象,加一个新曲线只需要继承 CamCurve,重写 calculate 方法就行。这就是「开闭原则」——对扩展开放,对修改关闭。

1.5 本章知识体系

下面这张图,是我自己总结的本章知识结构。你看一遍,心里就有数了。

Python基础回顾 环境配置 Anaconda安装 虚拟环境创建 库安装(pip/conda) NumPy 数组创建与运算 三角函数 数值微分(gradient) Matplotlib 画布与子图 曲线绘制与样式 标签与网格 面向对象编程 类与对象 | 继承与多态 | 封装凸轮曲线 → 凸轮曲线参数化设计 ←

这张图你看懂了吗?从上到下,环境配置是地基,NumPy和Matplotlib是左右手,面向对象是组织方式。最终都指向凸轮曲线参数化设计这个目标。

💡 我的建议: 这一章的内容,你不需要一次全记住。先搭好环境,跑通代码。后面每章都会用到这些基础,用着用着就熟了。我当年学Python也是这么过来的——先会用,再理解。

公众号:蓝海资料掘金营,微信deep3321