我的2009的,我是过2011的返回的也是和你一样的
不过这两种表达式应该是一样的
我分别代过数值去检验,得到的结果是一样的
但是我找不到办法用matlab将你得到的表达式转变成我得到的
不过查了一下资料,用手推算应该可以证明两者是一样的
以下是我查到最有用的一段
log函数在实数域中不能对负数和零进行计算,
MATLAB中的log函数则可以接受负数输入,并将其作为复数进行处理。
而log(0)返回-inf
对于复数元素x+i*y,其自然对数等于log(abs(x+i*y))+i*atan2(y,x)。
也就是说复数x+i*y的自然对数得到的结果是:
实部是原复数的模的自然对数,虚部是原来的幅角
所以用复数域定义的自然对数log,是可以表示atan2的
可能是这样,所以新版本的matlab对符号运算优化了一下
求角度应该atan2的,但是atan2不能用于符号运算,所以旧版本就无能为力
而新版本用log函数表示,就解决了这个问题
我版本的atan((b*kx + a*ky*tan(t0/2))/(a*ky - b*kx*tan(t0/2)))写为atan2
atan2(b*kx + a*ky*tan(t0/2) ,a*ky - b*kx*tan(t0/2));
让b*kx + a*ky*tan(t0/2)=Y,a*ky - b*kx*tan(t0/2)=X,再让Z=sqrt(X^2+Y^2)
atan2(Y,X)于atan2(Y/Z,X/Z)是一致的,只是将模归一化了,那么
log((X+Y*i)/Z)= log( (X^2+Y^2)/Z^2)+i*atan2(Y/Z,X/Z)
=log(1)+i*atan2(Y/Z,X/Z)=0+i*atan2(Y/Z,X/Z)=i*atan2(Y,X)
所以atan2(Y,X)=-i*log((X+Y*i)/Z)
也就是atan2可以由模归一化后的X+Yi的自然对数乘以-i获得
另一方面可以通过将tan化为cos/sin 而cos和sin函数又可以通过欧拉公式exp函数表示
最终tan(t0/2)可以化为用exp(i*t0)表示
tan(t0/2)=(i - i*exp(i*t0))/(exp(i*t0) + 1)
篇幅有限推导过程就不写了,最后这两个结果应该是等价的
考虑到atan没有像给出atan2那样正确的结果,
所以新版本给的用log表示的结果应该更不会有问题