Итерация для сходимости в Matlab без использования цикла while

Мне нужно повторить процесс, в котором у меня есть начальное предположение для числа Маха (M0). Это первоначальное предположение даст мне другое предположение для числа Маха, используя два уравнения (Mn). В конце концов, я хочу повторять этот процесс до тех пор, пока ошибка между M0 и Mn не станет небольшой. У меня есть следующий фрагмент кода, и он действительно хорошо работает с циклом while.

Однако я боюсь, что цикл while потребует много итераций и вычислительного времени для определенных входных данных, поскольку это будет частью более крупного кода, который, скорее всего, даст невозможные входные данные для цикла while.

Поэтому мой вопрос следующий. Как я могу повторить этот процесс в Matlab, не консультируясь с циклом while? Код, который я реализую сейчас, выглядит следующим образом:

%% Input
gamma = 1.4;
theta = atan(0.315);
cpi = -0.732;
%% Loop
M0 = 0.2; %initial guess 
Err =  100;
iterations = 0;

while Err > 0.5E-3  
B = (1-(M0^2)*(1-M0*cpi))^0.5; 
Mn = (((gamma+1)/2) * ((B+((1-cpi)^0.5)*sec(theta)-1)^2/(B^2 + (tan(theta))^2)) - ((gamma-1)/2) )^-0.5;
Err = abs(M0 - Mn);
M0 = Mn;
iterations=iterations+1;
end

disp(iterations) disp(Mn)

Большое спасибо


person Balraj Boyal    schedule 23.08.2015    source источник
comment
Google говорит мне, что почти все, кто выполняет итерации сходимости в Matlab, используют цикл while. Возможно, вы захотите добавить еще одно условие в цикл while, а именно максимальное количество итераций: while Err > 0,5E-3 && итераций‹1e3 или сколько угодно итераций.   -  person Adriaan    schedule 23.08.2015


Ответы (2)


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

Если у вас есть конкретное увеличение или уменьшение в M0, вы можете инициализировать вектор M0 и выполнить векторные вычисления для B и Err.

Но с sec и tan это невозможно.

Другой ватой было бы использование параллельной обработки. Но, поскольку вы меняете M0 на каждой итерации, вы не можете использовать цикл parfor.

Что касается цикла for, в MATLAB вам нужен массив для for «командного» аргумента (например, 1:10 или 1:length(x) или i = A, где A = 1:10 или A = [1:10;11 :20]). Поскольку вы оцениваете условие и в зависимости от результата оценки вы судите, продолжаете ли вы выполнение или нет, кажется, что цикл while (или do while на другом языке) - единственный путь.

person Xxxo    schedule 23.08.2015

Я думаю, вам нужно прояснить вопрос. Если проблема, которую вы хотите решить, заключается в том, что для вычисления некоторых входных данных требуется много времени, это не цикл while, который требует времени, а многократное выполнение кода, которое вызывает это. Любой циклический метод будет ограничен временем выполнения блока кода, умноженным на количество итераций, необходимых для сходимости.

Вы можете ввести что-то, чтобы остановиться на определенном количестве итераций, концептуально:

Пока ((ошибка > допуск) && (количество итераций ‹ предел))

Если вам нужен ответ, который не требует повторения кода, это похоже на поиск решения в закрытой форме, и я подозреваю, что этого не существует.

Изменить, чтобы добавить: под не существующим я подразумеваю практическую форму, которая может быть реализована более эффективным способом, чем итерация решения.

person Chris    schedule 23.08.2015