利用plot函数画出图像,图像为空白,怎么解决
利用plot函数画出图像,图像为空白,解决方法如下:
直接按照你的程序运行,y的值除了第一个都是-Inf,所以无法作图。如果你需要计算精确值得话,可以考虑计算y的对数。如果只是想看看x和y的关系曲线,那可以把t的值减小一些,比如改成:
t = (0:10000:100000000)/100000000;
这样就可以画图了,只是这样x和y的值都会改变。而x和y都是t的非线性的表达式,这样减小t的值,y对x的曲线形状肯定也改变了,简单来说,就是只画了曲线的前100000000分之一。这样画成的曲线是这样的:
可以大致看出这个曲线的走势,就是往右边越来越陡峭的下降,直到-inf。
看到这里肯定有疑问,为什么y的值其实不大(-0.3),却会成为-inf?仔细看下题主给出的这个式子,为了便于描述,我把这些分式表示的数字都计算成小数了(造成的误差不大,不会影响结果):
y=0.1997*t-0.0040*(log(6.2687*(387.5939*exp(49.4697*t)-387.1945).^2);
再简化一下:
y=A*t-B*(log(C*(D*exp(E*t)-F).^2);
可以看出我们的计算经过了:先求exp->减去常数->平方->取对数 这个过程,其实计算前后数量级应该变化不大,但是在计算过程中求exp再平方这个步骤的中间值很大,很有可能导致溢出,所以就会产生-inf了。找到了原因,接下来我们想办法解决它。
首先根据对数运算的性质,平方可以取出来:
y=A*t-2*B*(log(C*(D*exp(E*t)-F));
然后,系数C乘在大数的前面也可能导致溢位,所以也取出来:
y=A*t-2*B*(log(D*exp(E*t)-F)+log(C));
系数D的值也不小,一样提出来:
y=A*t-2*B*(log(exp(E*t)-F/D)+log(D)+log(C));
在这里D的值为387.5939,F的值为387.1945,F/D约等于1(小于1),由于t>0,这里exp(E*t)总是大于1的。当exp(E*t)的值不是很大时,F/D不能忽略,而当exp(E*t)很大时,F/D就可以忽略了。
现在让我们看看这个分界点取在多少比较好。先画出 :
y=A*t-2*B*(log(exp(E*t)-F/D)+log(D)+log(C));
可以看出虽然t的取值是从0到20,但是画到t=14.34的时候,就没有了,这说明后面的数值是-inf了。这个时候exp(E*t)等于多少呢?
exp(E*14.34)=1.2205e+308
10的308次方!
当然这是Matlab在我机器上所能计算的最大的double型数值,这个数字比1大太多太多了,完全可以忽略掉这个1了。那我们就取这个分界点在14.34吧,当t大于14.34时,忽略F/D,这样y的计算式可以化简为:
y=A*t-2*B*(E*t+log(D)+log(C));
这个形式就不会有巨大的中间数值,可以放心计算了。
通过这些分析,可以把y的计算公式写成如下的分段形式:
if (t<14.34)
y=A*t-2*B*(log(exp(E*t)-F/D)+log(D)+log(C));
else
y=A*t-2*B*(E*t+log(D)+log(C));
end
这样就可以画出x-y曲线:
这就是题主想要画的曲线了。由于t的取值步长是1000,所以从第二个点开始,就是按照后半段公式计算的y,y就是t的线性函数。而x是t的对数函数,于是就画出了上面这样的图形。其实这个图形在t的值比较小的时候,是有其它的形态变化的,参见第一个图。