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