matlab中diff函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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'));

相关文档
最新文档