• 24小时客服在线
  • info@qimumu.top

作者:Fu_Qingchen

软件资料库

将来,我估计要换台电脑,但是有一对使用频率很低但是容易忘记的软件,这里来记录一下

PDF叠加

将两个PDF叠加起来,效果如下图所示。用它的主要原因是Goodnote导出的PDF会让原本识别出来的中文乱码,将笔迹单独导出并与原文件叠加可以实现效果,而且不会出现乱码

这里可以使用python库PyPDF4实现,首先在命令行进行安装

pip install PyPDF4

然后新建一个py代码文件,运行即可

from PyPDF4 import PdfFileWriter, PdfFileReader
def create_watermark(input_pdf, output, watermark):
    watermark_obj = PdfFileReader(watermark)
    pdf_reader = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()
    for i in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(i)
        page.mergePage(watermark_obj.getPage(i))
        pdf_writer.addPage(page)
    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    create_watermark(
    input_pdf = r'C:\Users\Administrator\Desktop\PDF_demp.pdf', 
    output = r'C:\Users\Administrator\Desktop\watermarked_pdf.pdf',
    watermark = r'C:\Users\Administrator\Desktop\watermark.pdf')

理论力学回顾

相关知识回顾

最近搞毕业设计遇到了一些理论力学的问题,发现自己忘记的好快,所以来回顾一下。理论力学是各种力学的基础,讨论物体不失效,不变形情况下运动和力的关系

理论力学主要分为三大部分:

  • 静力学:讨论静止状态下物体的受力,主要包括力的平衡,力系的简化。
  • 运动学:讨论物体的运动状态,主要包括运动的描述,复合运动速度和加速度的求解。
  • 动力学:讨论力和物体的关系。主要解决给定力求运动轨迹、速度。动力学求解方法有很多种,任意一种即可。

静力学

静力学内容比较少,也比较简单,其主要思想是分而治之。这一块的核心就是画受力分析图,然后根据受力分析图求解约束力。其中要注意的地方就是力和力偶的概念,还有他们的相互转化。其主要内容包括:

运动学

运动学稍微多一点,但是同样比较简单,就是公式变多了。这一块的核心是选择动点动系画运动图,然后根据对应的公式进行求解。要注意点的绝对运动、相对运动、牵连运动的概念,然后有个科氏加速度。这一块的知识在机械原理中会在此用到。其主要内容是:

动力学

这一块内容很多很杂,求解方法也有很多。主要有两派,一派是以牛顿为主导的经典力学解法,在笛卡尔坐标系下用动量动量矩动能定理求解,另一派是以拉格朗日为主导的分析力学的解法,在广义坐标系下用拉格朗日方程求解。其中,分析力学以经典力学中的达朗贝尔原理和虚位移原理作为基础,主要研究功能关系,不需要复杂的运动学求解。

在这个里面最重要的思想是守恒,还有达朗贝尔原理、虚功原理和广义坐标系。这一块也是理论力学的核心,同时,这一块的知识在材料力学中会使用到。

经典力学主要内容如下:

分析力学主要内容如下: (这里为理论力学Ⅱ的部分内容)

练习

import sympy as sym
sym.init_printing(use_latex="mathjax")

这个题目的来源是模拟 https://www.bilibili.com/video/BV17A411h7wJ 这个视频 10:33 的内容,通过这个巩固一下自己的理论力学和编程能力。这个也是 https://www.qimumu.top/2020/04/04/%e7%94%a8python%e6%9d%a5%e8%ae%a1%e7%ae%97/ 这篇文章的应用实例

已知两个物体通过一根绳子挂在一根柱子上,其中有一个物体有动能,该物体运动至最高处的状态如图所示,忽略摩擦以及柱子的直径,求其运动方程

取如图所示,m,M​为物体质量,​l,θ为有动能的物体到柱子的长度和绳子的角度,绳子总长S,易得两个物体的坐标可以表示为

对时间求导,可以得到他们的速度为

l, theta, dl, dtheta, S = sym.symbols(r'l, theta, \dot{l}, \dot{\theta}, S')
pm, pM = sym.Matrix([-l*sym.cos(theta), -l*sym.sin(theta)]), sym.Matrix([0, l-S])
dpm, dpM = sym.Matrix([-dl*sym.cos(theta) + l*dtheta*sym.sin(theta), -dl*sym.sin(theta)-l*dtheta*sym.cos(theta)]), sym.Matrix([0, dl])
pm, pM, dpm, dpM

​求解其动能和势能为

m, M , g= sym.symbols(r"m, M, g")
T = (1/2*m*dpm.T*dpm + 1/2*M*dpM.T*dpM)[0]<br>V = m*g*pm[1] + M*g*pM[1]
T, V

​L = T – V为

L = T - V
L

​由拉格朗日方程得

func_temp = sym.Matrix([[sym.diff(L, dl), sym.diff(L, l)]
[sym.diff(L, dtheta), sym.diff(L,  theta)]])
sym.simplify(func_temp)
​ddl, ddtheta = sym.symbols(r"\ddot{l}, \ddot{\theta}")
dLddl = ddl*(M + m)
dLddtheta = ddtheta*l**2*m + 2*dtheta*l*m*dl
sym.simplify(sym.Matrix([dLddl-sym.diff(L, l), dLddtheta-sym.diff(L,  theta)]))

​整理得到微分方程

取初始条件

用数值(暴力)解法可以写出迭代式

这样就可以求解出位置关于时间的函数,绘制成动画如下

用Python来计算

位置导航:首页/ 技术杂谈(投稿)


最近做毕业设计的时候需要计算机器人运动学和动力学,但是这玩意在计算过程中需要计算很多矩阵,这个就很头疼。一般这种计算直接给MATLAB,但是它太太太大了,界面也太太太丑了,而且一运行就会很卡,再加上MATLAB也很贵,因此用了python的sympy库。用了之后发现这个是一个宝库,遇到问题,别问,问就python因此写一下。

Sympy是啥

这是一个 可以免费使用 的用python写的库(相当于打包好的一堆函数),然后你可以调用这些函数来完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题。sympy(symbol-python)主要进行的是符号计算,就是化简表达式之类的。

sympy有以下功能:

  • 表达式化简,求值,变形
  • 微积分
  • 求解线性或非线性方程
  • 求解微分方程或差分方程
  • 矩阵运算
  • 数学公式的 TeX 或 LaTeX 显示

矩阵运算、微积分和表达式化简一般来说比较常用,LaTeX输出和AxMath结合可以直接把结果输出到Word里面,或者Markdown。

符号计算应用

矩阵应用

这种用例子看最快了。首先看个矩阵运算

假设一个点p[px py pz]^T,它先绕X轴旋转α度,再绕Z轴旋转β度,求坐标,很容易得到新点的表达式为

其中Rot(axis, angle)表示旋转矩阵。

要求解这个首先需要导入sympy这个库,为了它的输出更加美观使用init_printing函数

import sympy as sym
sym.init_printing(use_latex="mathjax")

然后表示出你设置的符号,像上面的px, py, pz, α , β 就是的

px, py, pz, alpha, beta = sym.symbols(r"p_x, p_y, p_z, \alpha, \beta")

其中sympy用symbols函数申明符号,用逗号隔开,支持LaTeX语法,这里在字符串前面加r是为了防止一些转义字符引起bug

符号定义好了就可以定义矩阵的,使用sympy的Matrix类创建矩阵,为了方便使用,这里用定义三个函数给出(其实只用写一个然后坐标轮换就可以了)

def RX(theta):
    return sym.Matrix([
        [1, 0, 0],
        [0, sym.cos(theta), -sym.sin(theta)],
        [0, sym.sin(theta), sym.cos(theta)],
    ])
def RY(theta):
    return sym.Matrix([
        [sym.cos(theta), 0,sym.sin(theta)],
        [0, 1, 0],
        [-sym.sin(theta), 0,sym.cos(theta)],
    ])
def RZ(theta):
    return sym.Matrix([
        [sym.cos(theta), -sym.sin(theta), 0],
        [sym.sin(theta), sym.cos(theta), 0],
        [0, 0, 1],
    ])

符号和矩阵定义好了,下面就是进行计算

p_after = RZ(beta)*RX(alpha)*sym.Matrix([px, py, pz])
p_after #这一行用于输出

这样运行一下就可以了,输出结果如下

还可以通过latex函数输出latex代码如下,用【\】替换【\\】就可以粘贴到AxMath里了。

矩阵+积分

这里用一个惯性矩矩阵的例子来说明,比如说要求下面这个方块的惯性矩矩阵

惯性矩矩阵的定义如下

这时候就要用到积分了,sympy中计算积分的函数是 integrate (function)可以计算不定积分,加入定义域后可以计算定积分 integrate (function, (x, x_low, x_up))

由于这里是三次积分,就需要进行三次套娃,例如Ixx可以这么写

x, y, z, rho = sym.symbols(r"x, y, z, \rho")
w, l, h = sym.symbols("w, l, h") 
Ixx = sym.integrate(sym.integrate(sym.integrate((y**2 + z**2)*rho, (x, 0, w)), (y, 0, l)), (z, 0, h))

最终写成代码并输出是这样的

和课本上是一样的(注意m=ρwlh)

Fu_Qingchen, LearningBySharing2020