Как правильно использовать Recursion в MATLAB? - PullRequest
3 голосов
/ 21 января 2011

У меня есть простой m-файл, который я создал как рекурсивную функцию:

function[velocity] = terminal(m,c,t,vi)
%inputs:
% m = mass
% c = coeffcient of drag
% t = time
% vi = initial velocity

if t==18, velocity = vi+(9.8-c/m*(vi))*2;
    return 
end

velocity = vi+(9.8-c/m*(vi))*2;
velocity  %used to print out velocity for debugging
terminal(m,c,t+2,velocity);
end

Расчет скорости выполняется правильно, поскольку он печатает каждую рекурсию. Однако «ans», который возвращается в конце, является первым вычисленным значением рекурсии. У меня вопрос, как правильно установить рекурсивную функцию Matlab? Или это можно сделать, и лучше ли использовать цикл?

Ответы [ 4 ]

6 голосов
/ 21 января 2011

Хотя мой ответ будет отклоняться от программирования и попадать в область исчисления, следует отметить, что вы можете решить свою проблему как без рекурсии или цикла, так как вы можете точно решить для уравнения v(t), используя интегрирование.Похоже, что вы моделируете сопротивление Стокса на падающем теле, поэтому вы можете использовать четвертую формулу из этой таблицы интеграции , чтобы вычислить конечную скорость vFinal, которая достигается после паденияв течение времени tDelta с учетом начальной скорости vInitial.Вот результирующая формула, которую вы получите:

vFinal = 9.8*m/c + (vInitial - 9.8*m/c)*exp(-c*tDelta/m);

Это будет более точный ответ, чем аппроксимация vFinal путем последовательных шагов вперед во времени (то есть метод Эйлера , которыйможет отображать значительные ошибки или нестабильности, если предпринятые временные шаги слишком велики).

4 голосов
/ 21 января 2011

Терпите меня, не делали много Matlab в течение некоторого времени.

Но я бы просто назвал вашу функцию итеративно:

velocity = vi
for t = 0:2:18
    velocity = velocity+(9.8-c/m*(velocity))*2;
end

Тогда для каждого случая t он вычислит скорость для заданной начальной скорости и обновит это значение своей новой скоростью.

Чтобы выполнить пошаговые шаги размером 2, просто добавьте к нему свой размер шага.

Обновлено в ответ на комментарии

1 голос
/ 21 января 2011

Проблема с рекурсией здесь заключается в том, что она добавляет накладные расходы на вызовы функций каждый раз при выполнении.Это сделает ваш код намного медленнее и менее эффективным в Matlab.Вместо этого используйте цикл, и вы будете намного впереди вещей.Да, есть случаи, когда рекурсия является ценным инструментом.Но во многих случаях тщательно написанный цикл является лучшим решением.

Наконец, когда вы действительно используете рекурсию, узнайте, когда применять такие инструменты, как памятка, для улучшения поведения алгоритма.Запоминание просто означает не пересчитывать то, что вы уже сделали.Например, можно использовать рекурсию для последовательности Фибоначчи, но это ужасно неэффективный способ сделать это.

1 голос
/ 21 января 2011
velocity = terminal(m,c,t+2,velocity)

должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...