Интерпретация вывода dsolve для использования с ODE45 [MATLAB]

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

Я использовал dsolve;

syms x(t) v(t) fi(t)

[x(t), v(t)] = dsolve(diff(x) == v, diff(v) == fi/m, x(0) == [-L, -L], v(0) == [5, 10] )

что дает мне;

   x(t) =



int(fi(x)/5, x, 0, t, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true) - 5





v(t) =

C2 + t*(int(fi(x)/5, x, 0, t, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true) - 5) + int(-(x*fi(x))/5, x, 0, t, 'IgnoreSpecialCases', true, 'IgnoreAnalyticConstraints', true)

Теперь мне нужна помощь в обработке результата, и мне интересно, могу ли я использовать этот результат, чтобы получить что-то из ode45? Также я хочу построить решение как эталонную траекторию для моделирования 500 частиц, движущихся через силовое поле.


используя ODE45:

function dxdt = solution(t,y0)
frprintf('Second stop')
.....
dxdt = [x, v]
end

вызов из основного файла:

t:dt:t_f
y0 = [x0,v0]
fprintf('first stop')
[x, v] = ode45(@solution, y0, t)

Я настроил его так, что если код будет работать гладко, он будет печатать «первая остановка, вторая остановка, третья остановка» и «четвертая остановка», он печатает только первую остановку, и вот где я получаю ошибку.


person Oskar Paulsson    schedule 18.05.2015    source источник
comment
dsolve и int предназначены для символьной математики и предназначены в основном для получения аналитических решений. ode45 используется для численного решения ОДУ. Эти две вещи очень отличаются друг от друга. Ваши символические уравнения здесь полностью абстрактны, поэтому вам не следует ожидать каких-либо решений. Я рекомендую вам вернуться к изучению того, как использовать ode45. Прочтите документацию (doc ode45 в командном окне). Попробуйте примеры. Не ждите, что сразу все поймете. Если вы столкнетесь с проблемами / вопросами, выполните поиск на этом сайте. Если вы задаете вопрос, убедитесь, что он конкретен.   -  person horchler    schedule 18.05.2015
comment
То есть я не могу ничего из этого вставить в ode45?   -  person Oskar Paulsson    schedule 19.05.2015
comment
Нет. Не вижу смысла. dsolve предназначен для того, чтобы дать вам аналитическое решение дифференциального уравнения, если оно существует. Здесь ее не может быть, потому что вы все указали в терминах абстрактной функции (функции без определения) fi. Если вы хотите использовать символьную математику для получения функций для ode45, -numeric-solution/" rel="nofollow noreferrer">см. этот пост в блоге MathWorks.   -  person horchler    schedule 19.05.2015


Ответы (1)


Предполагая, что вы где-то определили

function F = fi(t)
    F = ...
end

вы определяете функцию ODE как (используя m в качестве глобальной переменной)

function doty = odefunc(t,y)
    doty = [ y(2); fi(t)/m ]
end

и позвони

t = t0:dt:tf
y0 = [ x0, v0 ]
t,y = ode45(odefunc, t, y0)

plot( t, y(:,1) )

Как правило, вектор y будет содержать точку в фазовом пространстве (положение и скорость/импульс) для всех частиц или объектов в системе. В odefunc вы должны вычислить силы для этой конкретной точки фазового пространства в момент времени t и составить из этого вектор производной в точку фазового пространства.

В трехмерном моделировании вы, например, можете сделать так, чтобы y(6*(k-1)+1:6*(k-1)+3) были положением частицы k, а y(6*(k-1)+4:6*(k-1)+6) - вектором скорости. Или вы можете разделить позицию и скорость с помощью y(3*(k-1)+1:3*(k-1)+3) для позиции и y(3*(N+k-1)+1:3*(N+k-1)+3) для скорости для k-й из N частиц.

person Lutz Lehmann    schedule 18.05.2015
comment
Итак, давайте разберемся с этим прямо; У меня есть файл сценария, в котором я запускаю симуляцию и вычисляю силу, действующую на каждую частицу для каждого временного шага, поэтому для F нет функции, только несколько строк, где я ее вычисляю. во втором примере это все, что нужно для этой функции? а что касается его вызова, я делаю это из своего основного файла сценария, да? - person Oskar Paulsson; 20.05.2015
comment
Нет, нужно уметь вычислять силу для каждой точки фазового пространства системы. Полученный вектор производной вычисляется в odefunc. И да, вызов ode45 ближе к main в иерархии вызовов, чем odefunc. Или содержится в основном файле. Вы знаете, что у вас может быть несколько блоков function ... end в одном файле, именование и верхняя функция важны только для автоматической загрузки файла. - person Lutz Lehmann; 20.05.2015
comment
Все еще сталкиваюсь с некоторыми проблемами с этим; Я делаю этот вызов: t = 0:0.001:t_f; x0 = [-5, -5]; v0 = [5, 10]; U = [x0,v0]; S = ode45(odefunc, t, U);' 'plot(t,S(:,1),'g.') xlabel('t'); ylabel('x'); к этой функции: function dxdt = odefunc(t,x) m = 1; dxdt_1 = fi; dxdt_2 = v0 + (t/m)*fi; dxdt = [dxdt_1; dxdt_2]; end и он говорит Неопределенная функция или переменная 'odefunc'. :/ - person Oskar Paulsson; 20.05.2015
comment
Возможно, вам нужно указать его как @odefunc. Однако при интерпретации odefunc может возникнуть ошибка. Кроме того, вы получаете dxdt_x = v и dxdt_v = fi/m, в odefunc нет v0. Позаботьтесь о совместимых форматах матриц. - person Lutz Lehmann; 20.05.2015
comment
Я добавил @, но получил еще одну ошибку; Ошибка при использовании февала Undefined function 'solution' for input arguments of type 'double'. Error in odearguments (line 87) f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0. Error in ode45 (line 113) [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ... Error in lab1script2d (line 119) [x,v] = ode45(@solution, t, y0); - person Oskar Paulsson; 21.05.2015
comment
Не могли бы вы добавить текущее состояние использования ODE45, соответственно. ODE15 на вопрос (с использованием упрощенного минимального примера с теми же ошибками) или открыть для него новый вопрос? Отсутствует множество деталей, небольшие ошибки не должны приводить к внутренним сообщениям об ошибках процедур Matlab. - person Lutz Lehmann; 21.05.2015
comment
Я расширил существовавший ранее вопрос - person Oskar Paulsson; 22.05.2015
comment
Можете ли вы получить примеры de.mathworks.com/help/matlab/ref/ ode45.html работать, копируя их в один файл для каждой функции или в один файл? Можете ли вы воспроизвести свою ошибку на этих примерах, можете ли вы решить ее, изменив порядок функций? - person Lutz Lehmann; 22.05.2015
comment
Я заставил его работать сейчас; Я переименовал .m-файл, содержащий функцию - person Oskar Paulsson; 22.05.2015