#matlab #nested-loops #runge-kutta
#matlab #вложенные циклы #Рунге-Кутта
Вопрос:
Я написал функцию плюс скрипт для вычисления и построения графика отклика системы с 1 степенью свободы с использованием метода Рунге-Кутты 4-го порядка в matlab. Вот в чем дело, я хочу построить график отклика системы на разные значения входных данных. У меня нулевые начальные условия, а входные данные следующие:
F(t) = 5*sin(w*t)
Где w = [2 5 10]
Я не знаю, как использовать цикл в моей функции, чтобы сформировать пространство состояний для всех значений w и решить мое уравнение и построить его для разных значений w, что делает разные входные данные для каждой итерации. Обратите внимание, что один из способов сделать это написать три разные функции для всех трех случаев и вычислить ответ.Я этого не хочу. Мне просто нужна одна функция и мой скрипт, который использует функцию ode45 для решения моего дифференциального уравнения, но для построения ответа для всех значений w. Как бы вы посоветовали мне это сделать. Вот мой скрипт и функция:
function xDot = Myfnc(t,x)
global w
f = 5*sin(w*t);
%% Using State Space
A = [0 1;-100 -1];
b = [0 f]';
xDot = A*x b;
end
clc;
clear
close all;
%%
% y(..) y(.) 100y = f(t)
% ZERO INITIAL conditions
% To A Harmonic Input
t = 0:0.1:15;
global w
w = 2;
Ics = [0 0];
[T,Y] = ode45(@Myfnc,t,Ics);
% plot(T,Y(:,1),'r','LineWidth',4)
% grid on
% hold on
% plot(T,Y(:,2),'k','LineWidth',3)
Комментарии:
1.
DoPri45
обычно, как и вode45
, реализуется для использования экстраполяции, то есть шагов 5-го порядка с «неправильной» оценкой ошибки, как и для шага 4-го порядка. Таким образом, вы получаете метод 5-го порядка с адаптивным размером шага. Не забудьте адаптировать допуски ошибок к уровню, который соответствует точности результата, который вы хотите получить.
Ответ №1:
Что мешает вам перебирать значения для w
?
for w in [2 5 10]
[T Y] = ode45(@(t,y)Myfnc(t,y,w),t,Ics,opts)
plot...
Ответ №2:
Возможно, вы ищете arrayfun. Это позволяет применять массив чисел к одной и той же функции.
Например, если у меня есть следующая функция:
function y = power(x)
y = x*x;
end
Затем я могу использовать его следующим образом, чтобы применить его к разным значениям:
X = [1 2 3];
arrayfun(@(x) power(x),X,'UniformOutput',false);
Как вы можете видеть, я использую анонимную функцию для переноса степенной функции.
Также я использую значение ‘UniformOutput’ равным false, чтобы функция могла возвращать различные типы элементов внутри массива ячеек. Если вам не нужны массивы ячеек, установите для него значение true.
Комментарии:
1. Это работает только в том случае, если время и вектор w имеют одинаковую длину. В моем уравнении вектор времени имеет 100 чисел, но вектор w имеет 3 числа. Мы не можем использовать это