用matlab如何解此方程:ln(x/50)/ln(v/29)=ln(0.5)/ln(0.8)其中v已知.

来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/22 20:03:23
用matlab如何解此方程:ln(x/50)/ln(v/29)=ln(0.5)/ln(0.8)其中v已知.用matlab如何解此方程:ln(x/50)/ln(v/29)=ln(0.5)/ln(0.8)

用matlab如何解此方程:ln(x/50)/ln(v/29)=ln(0.5)/ln(0.8)其中v已知.
用matlab如何解此方程:ln(x/50)/ln(v/29)=ln(0.5)/ln(0.8)其中v已知.

用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正名才对.
 
本来看上去一个并不复杂的问题,却引申出这么多的分析,想必看的有些不耐烦了吧.其实这些问题我也是开始时感到困惑,后来经过很多分析研究才基本搞明白的,所以就顺手把这个过程写了出来,希望对看到的朋友有帮助(当然,也许本来这些其实很简单,只是我孤陋寡闻而已).

使用solve函数和subs函数可以完成方程运算。

程序在附件中:

结果如下:

当v=5时,