【问题标题】:Matlab derivative returns a constantMatlab 导数返回一个常数
【发布时间】:2015-06-30 19:57:00
【问题描述】:

我定义了一个函数,它返回符号表达式或函数句柄的导数(加上更多)。

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

【问题讨论】:

    标签: matlab anonymous-function derivative


    【解决方案1】:

    这是一个解决方案。

    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 
    

    【讨论】:

    • 嗨!我为我们创建了一个 MATLAB 聊天室,以防您想讨论与 MATLAB 相关的任何题外话,或者如果您想讨论跨度超过 cmets 块的内容。当你有时间时停下来! chat.stackoverflow.com/rooms/81987/matlab
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多