цикл не читает предыдущее значение - PullRequest
0 голосов
/ 16 января 2019

Кажется, я сейчас бьюсь головой о кирпичную стену, как ни стараюсь, я не вижу здесь своей ошибки.

Я пытаюсь написать цикл for в MATLAB, который использует приведенное ниже уравнение (адиабатическое сжатие) для вычисления нового давления после одного градуса вращения коленчатого вала в цикле четырехтактного двигателя.

P2 = P1 * (V2 / V1) ^2

Я использую рассчитанный объем из модели кривошипно-ползункового в качестве входных данных. Я пробовал это Excel, и он работает, как ожидалось, и дает общий максимальный вывод правильно.

Цикл for, о котором идет речь, находится ниже;

Cyl_P = ones(720,1)

for i = (2:1:length(Cyl_V))'

    Cyl_P(i,:) = Cyl_P(i-1,:) .* (Cyl_V(i,:) ./ Cyl_V(i-1,:)).^1.35

end

моя цель состоит в том, чтобы использовать первый элемент вектора Cyl_P, который равен единице, в качестве входных данных для уравнения, приведенного выше, и умножить его на второй элемент Cyl_V, деленный на первый, и умножить объемные условия на 1.35. это должно вычислить второй элемент Cyl_P. Затем я хотел бы вернуть это значение обратно в то же уравнение, чтобы вычислить третий элемент и т. Д.

Что мне не хватает?

Я поставил полный код ниже

Theta = deg2rad(1:1:720)'

Stroke = 82 / 1000
R = Stroke / 2
L = 90.5 / 1000
Bore = 71.9 / 1000

d_h = (R+L) - (R.*cos(Theta)) - sqrt(L.^2 - (R.*sin(Theta)).^2)
Pist_h = d_h

figure
plot(Pist_h)

Bore_A = (pi*Bore^2)/4
Swept_V = (Pist_h .* Bore_A)
Clear_V = max(Swept_V) / 10
Total_V = max(Swept_V) + Clear_V

Cyl_V = (Swept_V + Clear_V)

figure
plot(Cyl_V)

for ii = (2:1:length(Cyl_V))'
    div_V(ii,:) = (Cyl_V(ii) ./ Cyl_V(ii-1,:)).^1.35
end

Cyl_P = ones(720,1)

for i = (2:1:length(Cyl_V))'

    Cyl_P(i,:) = Cyl_P(i-1,:) .* (Cyl_V(i,:) ./ Cyl_V(i-1,:)).^1.35

end

figure
plot(Cyl_P)

1 Ответ

0 голосов
/ 16 января 2019

Ваша проблема заключается в переносе массивов, которые вы передаете в качестве аргумента, в циклы for. MATLAB читает for аргументов на строку, поэтому при подаче в нее столбца будет использоваться только первая итерация. Общие комментарии:

  • ' - сложная транспонирование, .' - обычная транспонирование.
  • i - это воображаемая единица в MATLAB , обычно не используют ее в качестве имени переменной.
  • 2:1:4 делает то же самое, что и 2:4, поскольку 1 является размером шага по умолчанию.
  • Пожалуйста, используйте точки с запятой, ;, после каждой строки, чтобы MATLAB не отображал результат каждой строки в командном окне. Это облегчает запуск сценария, и если у вас есть матрицы с записями> 1M, отображение содержимого может даже привести к аварийному завершению программы. Даже в этом случае вы повторяете 720 записей Cyl_P 720 раз. Для проверки содержимого переменных просто сломайте сценарий там, где это необходимо (или запустите его по частям), и изучите содержимое, где это оправдано (например, Cyl_P(1:3) здесь будет достаточно, чтобы проверить, заполняет ли цикл вектор как задумано).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...