用matlab如何解此方程:ln(x/50)/ln(v/29)=ln(0.5)/ln(0.8)其中v已知。
参考代码:
>> syms x v
>> solve(log(x/50)/log(v/29)-log(sym(0.5))/log(sym(0.8)),'x')
ans =
50*exp(log(2)*log(1/29*v)/log(5/4))
要点在于,对0.5和0.8取对数之前,先用sym将其转换为符号量,如果直接用 log(0.5)/log(0.8) 则会按照浮点数进行计算,则会造成精度损失,无法得到上面的解析结果。
另外有一个问题值得注意,上面的结果是在MATLAB 6.5版得到的(该版本的符号运算内核为Maple),然而在2008b(符号运算内核为MuPad)上得到的结果却是:
50/exp((log(v/29)*log(2))/log(4/5))
经在多个版本上实测,Maple内核的版本(如6.5、2008a)和MuPad内核的版本(2008b、2101a、2012b)得到的结果的确不同,如果进行验算:
syms x v
x=solve(log(x/50)/log(v/29)-log(sym(0.5))/log(sym(0.8)),x)
simple(log(x/50)/log(v/29)-log(sym(0.5))/log(sym(0.8)))
可已发现,Maple内核的结果没有问题,但MuPad内核的验算结果并不是0!!!
这个结果让我有些震惊,尽管多数用过MATLAB符号运算的人都倾向于认为Maple内核优于MuPad内核,但在这样一个简单的问题上MuPad内核居然会给出一个错误的结果,而且多年未改?那也太可怕了!
如果对求解结果做进一步分析,可以知道,其实两种结果是一致的:由于log(5/4)=-log(4/5),而exp(-x)=1/exp(x),所以两种结果其实是等效的。
上面的验算之所以MuPad内核结果非0,问题的原因出在进行化简的函数simple上,而且事实上,MuPad内核得到的结果要比Maple内核更严密,例如,如果声明符号变量x v为正,则验算的结果就没问题了:
syms x v positive
x=solve(log(x/50)/log(v/29)-log(sym(0.5))/log(sym(0.8)),x)
simple(log(x/50)/log(v/29)-log(sym(0.5))/log(sym(0.8)))
通过这个尝试,也解开了我之前的一个疑惑:
>> syms y
>> (y^3)^(1/3)
ans =
(y^3)^(1/3)
>> syms y positive
>> (y^3)^(1/3)
ans =
y
之前我一直批评MuPad的符号运算化简功能差,现在看来,应该为MuPad正名才对。
本来看上去一个并不复杂的问题,却引申出这么多的分析,想必看的有些不耐烦了吧。其实这些问题我也是开始时感到困惑,后来经过很多分析研究才基本搞明白的,所以就顺手把这个过程写了出来,希望对看到的朋友有帮助(当然,也许本来这些其实很简单,只是我孤陋寡闻而已)。