2015-06-30 1 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