依托于Maple的符号计算引擎,Matlab可以完成高等数学中几乎一切符号计算。这里简单记录一下蔡自兴《机器人学》第三版中第四章的双连杆的动能推导过程。

在书本上我们已知的信息是:

x2=d1sinθ1+d2sin(θ1+θ2)x_2 = d_1\sin\theta_1 + d_2\sin(\theta_1+ \theta_2)
y2=−d1cosθ1−d2cos(θ1+θ2)y_2 = -d_1\cos\theta_1 - d_2 \cos(\theta_1 + \theta_2)
v22=x˙2+y˙2v_2^2 = \dot{x}^2 + \dot{y}^2

其中 θi(i=1,2)\theta_i (i =1,2) 是时间的函数,我们通过演算可以得到与书中一样的不错的表达式:

v22=d21θ1˙2+d22(θ2˙2+2θ1˙θ2˙+θ2˙2)+2d1d2cosθ2(θ1˙2+θ1˙θ2˙)

v_2^2 = d_1^2\dot{\theta_1}^2 + d_2^2(\dot{\theta_2}^2+2\dot{\theta_1}\dot{\theta_2} + \dot{\theta_2}^2) + 2d_1d_2\cos\theta_2(\dot{\theta_1}^2 + \dot{\theta_1}\dot{\theta_2})

下面就以这个表达式为目标,探索如何利用Matlab进行带有导数的表达式的运算和化简

clc,clear,close all
syms th1(t) th2(t) d1 d2 Dth1 Dth2x2 = d1*sin(th1) + d2*sin(th1 + th2);
y2 = -d1*cos(th1) - d2*cos(th1 + th2);
v22 = diff(x2)^2 + diff(y2)^2

v22 指的是 v22v_2^2 ,上述代码的输出结果为:

v22(t) =(d2*cos(th1(t) + th2(t))*(diff(th1(t), t) + diff(th2(t), t)) + d1*cos(th1(t))*diff(th1(t), t))^2 + (d2*sin(th1(t) + th2(t))*(diff(th1(t), t) + diff(th2(t), t)) + d1*sin(th1(t))*diff(th1(t), t))^2

简化表达式

这个结果显然不是我们想要的,下面逐步进行变换化简

  1. 用变量 Dth1Dth2 替换 diff(th1(t), t)diff(th2(t), t) ,简化表达式

    v22_pretty = subs(v22,[diff(th1(t), t) diff(th2(t), t)],[Dth1 Dth2])v22_pretty(t) =(d2*cos(th1(t) + th2(t))*(Dth1 + Dth2) + Dth1*d1*cos(th1(t)))^2 + (d2*sin(th1(t) + th2(t))*(Dth1 + Dth2) + Dth1*d1*sin(th1(t)))^2
  2. collect 函数按照 d1 的降幂次合并同类项

    v22_collect1 = collect(v22_pretty,d1)v22_collect1(t) =(Dth1^2*cos(th1(t))^2 + Dth1^2*sin(th1(t))^2)*d1^2 + (2*Dth1*d2*cos(th1(t))*cos(th1(t) + th2(t))*(Dth1 + Dth2) + 2*Dth1*d2*sin(th1(t))*sin(th1(t) + th2(t))*(Dth1 + Dth2))*d1 + d2^2*cos(th1(t) + th2(t))^2*(Dth1 + Dth2)^2 + d2^2*sin(th1(t) + th2(t))^2*(Dth1 + Dth2)^2
  3. 表达式中出现了 cos2θ+sin2θ\cos^2\theta + \sin^2\theta 的表达式没有进行化简,下面用 simplify 函数进行化简

    v22_simplify = simplify(v22_collect1)v22_simplify(t) =Dth1^2*d1^2 + 2*cos(th2(t))*Dth1^2*d1*d2 + Dth1^2*d2^2 + 2*cos(th2(t))*Dth1*Dth2*d1*d2 + 2*Dth1*Dth2*d2^2 + Dth2^2*d2^2
  4. collect 依照 [d1 d2] 降幂次合并同类项

    v22_collect2 = collect(v22_simplify,[d1 d2])v22_collect2(t) =Dth1^2*d1^2 + (2*cos(th2(t))*Dth1^2 + 2*Dth2*cos(th2(t))*Dth1)*d1*d2 + (Dth1^2 + 2*Dth1*Dth2 + Dth2^2)*d2^2
  5. 上面的表达式中,还有 cosθ2\cos\theta_2 没有化简

    v22_collect3 = collect(v22_collect2,cos(th2(t)))v22_collect3(t) =d1*d2*(2*Dth1^2 + 2*Dth2*Dth1)*cos(th2(t)) + (Dth1^2 + 2*Dth1*Dth2 + Dth2^2)*d2^2 + Dth1^2*d1^2

4 和5与下面的语句等价

collect(expr,[d1 d2 cos(th2(t))])

最后得到了文章伊始的表达式

后记

在已知结果情况下,省去探索的步骤,1-5的语句可以直接化简为:

v22_pretty = subs(v22,[diff(th1(t), t) diff(th2(t), t)],[Dth1 Dth2]);
v22_simplify = simplify(v22_pretty);
v22_collcet = collect(v22_simplify,[d1 d2 cos(th2(t))]);

依照一般的习惯,表达式的化简多依赖于 simplifycollect ,像类似 expand (展开) horner (嵌套) 等函数通常是我们不希望遇到的。

Matlab符号计算求导与化简相关推荐

  1. 利用MATLAB进行求导

    导数是微积分中的一个重要的概念,又称为导函数值.在数学中,我们经常会利用导数来求切线.极值.拐点.渐近线等.在解决数学问题中,经常需要用到导数.MATLAB中提供了diff函数进行求导.本文对于MAT ...

  2. MATLAB符号运算之分式化简(基础)

    MATLAB常见的化简函数如下: pretty(f) 将符号表达式化简成与高等数学课本上显示符号表达式形式类似 collect(f) 合并符号表达式的同类项 horner(f) 将一般的符号表达式转换 ...

  3. matlab 曲线拟合求导,基于matlab曲线拟合的数据预测分析

    龙源期刊网 http://www.doczj.com/doc/2f22f716cbaedd3383c4bb4cf7ec4afe05a1b148.html 基于matlab曲线拟合的数据预测分析 作者: ...

  4. Matlab之求导篇

    matlab求导命令diff调用格式: diff(函数) , 求的一阶导数: diff(函数, n) , 求的n阶导数(n是具体整数): diff(函数,变量名), 求对的偏导数: diff(函数, ...

  5. Matlab中求导操作

    文章目录 前言 一.求导命令 二.使用方法 总结 前言 正文 一.求导命令 diff % 差分和近似导数%此 MATLAB 函数 计算沿大小不等于 1 的第一个数组维度的 X 相邻元素之间的差分: 二 ...

  6. [MATLAB]多项式求导/加减/乘除

    函数公式: 多项式的加减运算 多项式的加减运算非常简单,即相应向量相加减 多项式乘法 conv(p1,p2):多项式相乘函数.在这里,P1.P2是两个多项式系数向量 多项式除法 [Q,r]=decon ...

  7. 【matlab】求导

    一:matlab求一阶导 diff(y,x) 其中y是x的函数 二:matlab求二阶导 diff(y,x,2) 三:举例 syms x y y=x^3; dy=diff(y,x) ddy=diff( ...

  8. matlab 离散点求导_Matlab的离散点曲线导数曲率数值模拟方法

    模拟方法: 复制内容到剪贴板 代码 : clc; clear all; close all; x0 = linspace(0, 1); y0 = sin(x0).*cos(x0); h = abs(d ...

  9. MATLAB 函数求导的若干问题

    一.对多元函数求偏导数 假设f=x^2+y^2+2*x*y;我们定义了一个二元函数 f= x^2 + y^2 + 2*x*y,现在要求函数 f(x, y)对自变量 x 和 y 的偏导数,则代码如下 s ...

最新文章

  1. 学习笔记Spark(八)—— Spark SQL应用(3)—— Spark DataSet基础操作
  2. ML之LiR2PolyR4PolyR:使用线性回归LiR、二次多项式回归2PolyR、四次多项式回归4PolyR模型在披萨数据集上拟合(train)、价格回归预测(test)
  3. 【mysql】[error]group_concat造成的sql语法错误
  4. Xshell的一些实用技巧
  5. 计算机专业英语读书报告,英语读书报告怎么写
  6. 冒泡排序--Java
  7. [C] 从文件读取数据
  8. ELK快速搭建一个集中化日志平台
  9. 魔天记服务器维护,魔天记3月23日维护公告
  10. 瞬间几千次的重复提交,我用 SpringBoot+Redis 扛住了~
  11. Anatomy of a Program in Memory
  12. 小米青春版路由器解锁root与SSH方法
  13. Luarocks的使用
  14. java StringBuilder用法,用逗号拼接字符串 zhaoqian,sunli,zhouwu
  15. 哈工大游戏设计复习题
  16. 【Games101】图形的基础变换 总结
  17. Maximal GCD
  18. 用Python把B站视频弹幕爬下来,绘制词云图看看大家最关心什么!
  19. 什么是分布式数据存储
  20. 浅析Win2K/XP服务与后门技术

热门文章

  1. 特斯拉放弃私有化!马斯克想一出是一出
  2. HarmonyOS app 开发应用框架的架构和组成(Java)
  3. pcm格式封装wav
  4. window API播放pcm格式音频文件,函数waveOutOpen等
  5. 广州周立功CanTest卡使用教程一
  6. 如何编写高质量的 JS 函数(3) --函数式编程[理论篇]
  7. android手机无分区无法刷机,手机刷死了别说没提醒!安卓设备刷机前必看
  8. 视频会议高清桌面共享
  9. 解决WSL2与Proxifier无法同时使用的问题
  10. 点击化学DBCO-PEG-SPDP|二苯并环辛炔-聚乙二醇-3-(2-吡啶二硫代)丙酸N-羟基琥珀酰亚胺酯