2015-05-18 3 views
0

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

Я использовал 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) 

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

+0

'dsolve' и' int' предназначены для символической математики и предназначены главным образом для получения аналитических решений. 'ode45' используется для решения ODEs численно. Эти две вещи сильно отличаются друг от друга. Ваши символические уравнения здесь полностью абстрактны, поэтому вы не должны ожидать каких-либо решений. Я рекомендую вам вернуться к обучению использованию «ode45». Прочтите документацию ('doc ode45' в окне команд). Попробуйте примеры. Не ожидайте, что сразу выясните это. Если вы сталкиваетесь с вопросами/вопросами, найдите этот сайт. Если вы зададите вопрос, убедитесь, что он является конкретным. – horchler

+0

Так что я не могу поместить ничего из этого в ode45? –

+0

Нет. Я не вижу смысла. 'dsolve' призван дать вам аналитическое решение дифференциального уравнения *, если оно существует *.Он не может существовать здесь, потому что вы указали все в терминах абстрактной функции (функции без определения) 'fi'. Если вы хотите использовать символическую математику, чтобы помочь вам получить функции для 'ode45', [см. Это сообщение в блоге MathWorks] (http://blogs.mathworks.com/loren/2013/06/10/from-symbolic-differential- уравнения-на-их-числового раствор /). – horchler

ответ

1

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

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

вы определяете функцию ОДУ как (с помощью 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)) 

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

В 3D-моделировании вы, например, могли бы организовать, что 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 частиц.

+0

Итак, давайте получим это прямо; У меня есть файл сценария, в котором я запускаю симуляцию и вычисляю силу для каждой частицы за каждый временной шаг, поэтому для F нет функции, только некоторые строки, где я ее вычисляю. в вашем втором примере - это все, что есть в этой функции? , и что касается его вызова, я делаю это из моего основного файла сценария, да? –

+0

Нет, вам нужно вычислить силу для каждой точки фазового пространства системы. Следующим вектором производной является то, что вычисляется в odefunc. И да, вызов 'ode45' ближе к главному в иерархии вызовов, чем' odefunc'. Или содержится в основном файле. Вы знаете, что вы можете иметь несколько блоков 'function ... end' в одном файле, именование и верхняя функция важны только для автоматической загрузки файла. – LutzL

+0

По-прежнему сталкиваются с некоторыми проблемами с этим; Я делаю этот звонок: '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 ».» :/ –