2015-06-30 47 views
1

我定义了一个函数,它返回符号表达式或函数句柄(再加上几个)的导数。Matlab导数返回常量

function df = der(f) 
    if isa(f, 'cfit') || isa(f, 'sfit') 
     df = @(x) differentiate(f, x); 
    elseif isa(f, 'sym') || isa(f, 'function_handle') 
     syms r 
     F = sym(f); 
     df = matlabFunction(diff(F), 'Vars', r); 
    else 
     error('Not a derivative of a known type') 
    end 
end 

它运作良好,但是当我在换行,我得到的东西不产生阵列。

>> df = der(@(r) r) 

df = 

    @(r)1.0 

>> df([1,2,3]) 

ans = 

    1 

反正是有捕捉输出功能是否是一个常数,改变输出这样的行为,

>> df = der(@(r) r) 

df = 

    @(r)1.0*ones(size(r)) 

>> df([1,2,3]) 

ans = 

    1 1 1 

回答

2

这里有一个解决方案。

function df = der(f) 
    if isa(f, 'cfit') || isa(f, 'sfit') 
     df = @(x) differentiate(f, x); 
    elseif isa(f, 'sym') || isa(f, 'function_handle') 
     syms r 
     F = sym(f); 
     df = matlabFunction(diff(F), 'Vars', r); 
    % These next four lines have been added: 
     c = df(ones(1,2));    
     if length(c) == 1 
      df = @(x) c*ones(size(x)); 
     end        
    else 
     error('Not a derivative of a known type') 
    end 
end 

评估df = der(@(r) 20*r); df([1,2,3])现在给输出

ans = 

    20 20 20 
+0

嗨!如果你想讨论与MATLAB相关的任何与主题无关的内容,或者如果你想讨论比评论块长的内容,我已经为我们制作了一个MATLAB聊天室。当你有时间时就停下来! http://chat.stackoverflow.com/rooms/81987/matlab – rayryeng

1

为了解释这一错误在你的代码,syms r创建一个标符号变量。据我所知,没有可靠的解决方案来获得矢量化版本。

一个简单的 “修复”,逐个评估每个值:

>> arrayfun(df,[1,2,3]) 

ans = 

    1  1  1