【自用】Mathematica 使用

最近在学习机器人系统的动力学建模,涉及大量的符号计算,用手来算显然时费力不讨好的,最终我在Maple,Matlab和Mathematica三者中选择了后者。下面记录一些使用技巧和说明:

求导 f ' / f '[t] / D[f,t]

对于f ',它并不指定导数关于哪个变量求导,所以一般用于单变量求导,返回的是一个隐函数(lambda函数),其中#1表示输入参数中的第一个参数,例如

a[x_] := x^2; a' (* INPUT *)
2 #1 & (* OUTPUT *)

a[x_] := x^2 + y^2; a' (* INPUT *)
2 #1 & (* OUTPUT:这里因为a只是x的函数,所以单引号求导时把y当常数 *)

a[x_] := x^2; a'[5] (* INPUT *)
10 (* OUTPUT:这说明,这种方式非常适合求单一变量(如时间t)在某一时刻的导数值*)

a[x_] := x^2; a'[y] (* INPUT *)
2y (* OUTPUT:这要格外注意,后面[y]中其实是求a中唯一变量x的导函数在x=y处的值,而非对a关于y求导*)

a[x_, y_] := x^2 + y^2; a'(* INPUT *)
a' (* OUTPUT:如果是多变量,那么这个单引号求导其实就无法具体写出了只能写个a' *) 

a[x_, y_] := x^2 + y^2; a'[1,2](* INPUT *)
a'[1, 2] (* OUTPUT:可以看出多变量时,这么写也就是形式上求导,也没法代入求值 *) 

从返回值也能看出,f '[t]这种其实就是单一变量求导后代入t 而已,也就是,求函数a[x_]的导数在x=t处的导数值。此外,如果用单引号求导,还容易出现常值函数问题,这在数学上没问题,但是求出的东西让人看着很难受,所以一般我们都进行替换,如下:

0'(* INPUT *)
0 &(* OUTPUT *)

0' /. {0 & -> 0} (* INPUT *)
0 (* OUTPUT *)

所以更常用的还是使用D来求,如下:

a[x_] := 3 x^2; D[a,x] (* INPUT *)
0 (* OUTPUT:原因是a和a[x]是完全不同的两个东西,所以写a时,系统认为是与x无关的变量 *)

a[x_] := 3 x^2; D[a[x],x] (* INPUT *)
6 x (* OUTPUT:这是对的,但你也可能会疑惑,为什么不是D[a[x_],x],这是因为下划线在定义的时候表示x是一种泛指,可以接受任何类型,而在定义完后,如果你调用它时用的是a[x_]就会引起混乱,因为这本应是在定义式出现的语法,就会引起混乱,所以千万不要在变量中出现下划线,这是一个定义时才能出现的关键词*)

a[x_, y_] := 3 x^2 + y^2; D[a[x, y], x] (* INPUT *)
6 x (*和单引号求解相比,这个D[]方法因为指定了求导对象,所以能够求偏导数,建议以后设计符号运算,不要用单引号,最好都用D[],除非是比较简单*)

方程化简

先放个例子:

Clear["`*"];
(*变量定义*)
variables = {x, l, \[Theta], \[Phi]};
dotVariables = {xd, ld, \[Theta]d, \[Phi]d};
variables$t = {x[t], l[t], \[Theta][t], \[Phi][t]};
dotVariables$t = D[variables$t, t];
(*Lagrangian L*)
V = m0*g*(l*Cos[\[Theta]] + h*Sin[\[Phi]]);
v0 = Sqrt[(xd - l*\[Theta]d*Cos[\[Theta]] - h*\[Phi]d*Cos[\[Phi]] - 
       ld*Sin[\[Theta]])^2 + (ld*Cos[\[Theta]] - 
       l*\[Theta]d*Sin[\[Theta]] - h*\[Phi]d*Sin[\[Phi]])^2];
T = 1/2*(m1 + m2)*xd^2 + 1/2*J2*(xd/R)^2 + 1/2*J1*\[Theta]d^2 + 
   1/2*J0*\[Phi]d^2 + 1/2*m0*v0^2;
L = T - V;
Q = {-M2/R, F, M1 - M2, -M1};
(*替换 q\[Rule]q[t] qd\[Rule]q'[t]*)
L$t = L /. Thread[variables -> variables$t] /. 
   Thread[dotVariables -> dotVariables$t];
(*计算*)
lagrangeEquations = 
  Table[D[D[L$t, dotVariables$t[[i]]], t] - 
     D[L$t, variables[[i]]], {i, 1, Length[variables]}] == Q;
lagrangeEquations$Simplified = lagrangeEquations // Simplify;
TeXForm[lagrangeEquations$Simplified];
Result$TeXForm = 
 Table[lagrangeEquations$Simplified[[1, i]] == 
   lagrangeEquations$Simplified[[2, i]], {i, 1, 4}]
(*右键\[Rule]复制为TexForm*)

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值