matlab positive程序报错问题

问题描述:

matlab positive程序报错问题
clc
clear
syms t a k positive
t>=0;
a>0;
k>1;
R=(a.^k)/(t+a).^k;
f=diff(1-R)
lambda=f/R
MTTF=int(R,t,0,inf)
tmed=solve(R==0.5,t)
新启动的matlab,第一次run 这个程序时候,为什么 我加入positive就没报错.第一次运行时,不加positive就有报错. 而且更奇怪的是,如果第一次运行带positive不报错了,那么去掉positive后,再次运行程序,结果仍不报错.但这程序前面有clc和clear啊,应该不受到上一次运行的影响啊. 求高手解答!
1个回答 分类:综合 2014-09-22

问题解答:

我来补答
首先,sym 对象的是否支持关系运算(例如>=、>)与MATLAB版本有关.就我电脑里目前安装的三个版本而言,上述代码在6.5、2007b版肯定都会报错,因为这些关系运算操作符都没有定义;但在2013a就没有问题.所以,要想准确解释你遇到的现象,需要知道你的MATLAB 版本. 其次,clc 用于清除命令窗口里显示的内容,不会有任何其他作用. 而clear就比较有意思了,要想说清楚,需要先明确一个概念:MATLAB的符号运算是通过外部的引擎来实现的,也就是平常所说的符号运算内核.早期的内核是Maple,从2008b开始,换成了MuPad.很多人的看法是,MuPad内核比不上Maple内核,而从很多实际问题的求解经验来说,我个人也更喜欢Maple内核.不论用哪个内核,MATLAB在进行符号运算的时候,一方面会在MATLAB工作区里面生成相应的变量,另一方面,会在符号运算引擎里面生成相对应的变量,而真正的运算都是在引擎里面完成的,MATLAB工作区的符号变量只不过是一个“影子”,用于表达符号引擎里面的变量. 介绍完这些背景,接下来说clear命令. 如果单独输入clear命令,只会清除工作区中的变量,也就是把影子去掉了,而内核里面真实的变量仍然存在,对它所做的各种假设(Assumptions)例如positive、real都仍然有效,当你再次在MATLAB中使用sym或syms定义符号变量时,会把符号内核里面的变量和新的影子关联起来而已,也就是说,clear命令不会清除掉positive之类的假设. 如果希望彻底清除掉这些假设,可以用clear all或clear mex命令,这样会强制结束符号运算内核,从而使得那些假设失效.还有一些做法与具体版本有关,例如早期有clear maplemex 或 maple restart,后来的版本有syms t a k clear和reset(symengine). 另外,就2013a版本而言,即使不把符号变量声明成positive也不会报错,不知道楼主用的是什么版本?
再问: 回答太专业啦!谢谢啦!虽然不大懂什么内核运算, 不过clear all那个疑惑,解开了。我用的是R2013a. 是在校方网站下载的,用校邮箱注册才能使用的。但没写positive,确实报错。但positive确实不符合后面t>=0的语句。MTTF 报错Warning: Explicit integral could not be found. tmed报错..超字数了,具体写不了了..
再答: MATLAB分很多版本,除了平常说的每年发布两次的Release a和b之外,按操作系统又分Windows、Linux和Mac版,而各种平台的具体模块和功能往往也会存在差别。另一方面,根据用户的类别,又分成商业版、教育版、学生版、教室版等,后面的几种售价低廉,但功能上往往会加入一些限制。你说的这种版本有可能是学生版或教室版,由于我没有类似的测试条件,所以不好判断确切原因是什么。 我又在2008a和2012b两个版本上做了测试,2008a对于sym对象仍然未定义ge、gt之类函数或方法(也就是>=和>),会报错;2012b上则无论是否声明positive都不会报错:>> syms t a k
>> t>=0,a>0
ans =
0 <= t
ans =
0 < a
>>至于MTTF报错无法找到显式解的问题,应该也和版本有关,例如,我在2008a得到的结果是:>> syms t a k positive
>> R=(a.^k)/(t+a).^k;
>> MTTF=int(R,t,0,inf)
MTTF =
limit(-((t+a)^(1-k)*a^k-a)/(k-1),t = Inf)这个结果可能不是你期望的简单表达式,但应该说是比较严谨的,因为k和a的值未知,不是很适合直接给出某个表达式。 而在2012b上的结果如下:>> syms t a k positive
>> R=(a.^k)/(t+a).^k;
>> MTTF=int(R,t,0,inf)
MTTF =
piecewise([1 < k, a/(k - 1)], [k <= 1, Inf], [a == 1 and 1 < k, 1/(k - 1)])这个结果可能更清楚,它是分成几种情况给出不同的结果:如果1 < k,结果是 a/(k - 1)如果k <= 1, 结果是Inf如果a == 1 且 1 < k,结果是 1/(k - 1)第三种情况似乎是多余的?我也不知道为什么它会这样区分。 每一个字都是亲自写的,希望对楼主有帮助。
再问: 哇~ 真是高手啊,好专业啊! 可否能加个QQ 啊,小弟现在正学Reliability Engineering, 经常会用到matlab,刚开始学习。 还望日后能提点一下。 望前辈留下QQ 到我邮箱好吗。 我邮箱是xyb2124@163.com 谢谢啦!
再答: 抱歉,我不挂QQ。 有问题可以在这里求助,如果我刚好看到了,并且觉得自己能提供帮助会回答的。别的网友也可能帮到你。 如果觉得上面的回答对你有帮助,希望能够采纳。还有问题的话可以继续追问。
再问: Never mind:-),我还有一个问题,就是用matlab久了, 有没有什么比较专业性的操作习惯啊?打个比方,就好比我刚学这个,我是直接把公式打在command window里, 但后来研究.m文件时候, 我发现把公式打在editor里更方便,能无限运行,反复修改,还能保存, 感觉用着很舒服,以后也就这么用了, 但不知道对不对。 可否能赐教下类似的操作? 谢谢啦
再答: “有没有什么比较专业性的操作习惯”,这个问题有点太大了,我也不敢说自己有多专业,但用的多了,肯定会有很多习惯或技巧,那是积累的结果,我无法系统地总结出来。 说到你举的具体例子,一般来说,如果命令比较少,或者没太有保存价值,可以直接在命令窗口里面输入;但如果命令比较多,需要反复修改调试,或者有复用价值,那就保存到M文件里面再运行。
 
 
展开全文阅读
剩余:2000
下一页:格子里面填一下