Решение дифференциальных уравнений в MATLAB для разных значений входных данных

#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 числа. Мы не можем использовать это