matlab中diff函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
clc;clear;
syms x;
y=x^3+2*x^2+x+1;
dy=diff(y,x);
ddy=diff(dy,x);
ddy11=@(x)eval(diff(dy,x));
ddy12=@(x)eval(ddy);
ddy21=inline(eval(diff(dy,x)));
ddy22=inline(eval(ddy));
ddy11=ddy11(2)
ddy12=ddy12(2)
ddy21=ddy21(2)
ddy22=ddy22(2)
为什么ddy11和ddy12, ddy21, ddy22所得的值不一样呢?
inline函数和@究竟有些什么区别?
请高手指点!!
谢谢!!
恩是这个原因在使用@创建匿名函数时,@(varlist)之后的表达式一般不能是符号变量,只能是因变量和常数
但是inline函数可以将符号表达式转换为inline函数
另外eval计算的也是字符串表达式的结果,一般不处理符号表达式,如果表达式不是字符串,Matlab使用char函数将其转换为字符串
总结性说,inline()可以将符号表达式转换为函数,@()不可以,匿名函数一般用于自定义简单函数
我们来分析下ddy11=@(x)eval(diff(dy,x));
首先将计算diff(dy,x)返回符号表达式6*x+4,eval不管它的输入参数是什么,首先使用char函数将输入参数符号表达式6*x+4转换为字符串'6*x+4',然后创建匿名函数,该匿名函数将调用eval函数进行计算函数值
上面分析是我们认为的过程,好像没有问题!其实问题出在了diff(dy,x),由于Matlab中diff的参数可以多种格式,而匿名函数直接提供了x的值,此时Matlab直接将x看成是对dy的x次导数,而不是对dy进行关于变量x的一阶就到,故实际过程是
1、调用匿名函数的时候,将数据x直接传递给嵌套函数eval
2、此时x是一个常数,不是一个符号变量
3、diff(dy,x)对dy进行x阶级求导,注意不是对dy进行关于x的一阶导数
4、导数计算完毕后,eval函数将返回的参数转换为字符串
5、eval计算函数值
也许你会问,为什么只是将diff(dy,x)中的x换成了常数,而不将dy中的x也换成常数呢,呵呵这就是Matlab的智能的方面,diff第一个参数必须是符号变量,故没有将dy中x替换,另外就是dy中没有显示的表达出x,如果你直接显示表达出来,那么Matlab也会毫不客气的将它替换了
经过上面分析,我们就可以理解为什么dyy11(2)=6,dyy11(3)=0了
改进方法是将你的ddy11=@(x)eval(diff(dy,x));改为
ddy11=@(x)eval(diff(dy));或者ddy11=@(x)eval(diff(dy,'x'));