Начальные условия с нелинейным ОДУ в Mathematica - PullRequest
2 голосов
/ 17 июня 2010

Я пытаюсь использовать NDSolve [] Mathematica для вычисления геодезической вдоль сферы, используя связанный ODE:

x" - (x" . x) x = 0

Проблема в том, что я могу ввести только начальные условия для x (0) иx '(0) и решатель доволен решением, где x "= 0. Проблема в том, что моя геодезическая на сфере имеет начальное условие x" (0) = -x (0), о котором я понятия не имеюкак сказать mathematica.Если я добавляю это как условие, оно говорит, что я добавляю True в список условий.

Вот мой код:

s1 = NDSolve[{x1''[t] - (x1[t] * x1''[t] + x2[t] * x2''[t] + x3[t]*x3''[t]) * x1[t] == 0, x2''[t] -  (x1[t] * x1''[t] + x2[t] * x2''[t] + x3[t]*x3''[t]) * x2[t] == 0, x3''[t] - (x1[t] * x1''[t] + x2[t] * x2''[t] + x3[t]*x3''[t]) * x3[t] == 0, x1[0] == 1, x2[0] == 0, x3[0] == 0, x1'[0] == 0, x2'[0] == 0, x3'[0] == 1} , { x1, x2, x3}, {t, -1, 1}][[1]]

Я хотел бы изменить это так, чтобыначальное ускорение не ноль, а -x(0).

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 июня 2010

Я исправил эту проблему с помощью математической перестановки, а не решил свою первоначальную проблему:

Пусть V (t) - векторное поле вдоль x (t).

х. V = 0 означает d / dt (x. V) = (x '. V) + (x. V') = 0

Таким образом, выполняется уравнение D / dt V = V '- (x. V') x = V '+ (x'. V) x Это означает, что геодезическое уравнение становится: x "+ (x '. X') x = 0, и поэтому оно может быть решено с использованием начальных условий, которые у меня были изначально.

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

0 голосов
/ 17 июня 2010

Ну, как говорится в сообщении об ошибке - NDSolve принимает только начальные условия для производных ордеров, строго меньших, чем максимальный порядок, появляющийся в ODE.
У меня такое ощущение, что это скорее вопрос математики. Математически, {x''[0]=-x0, x[0]==x0}, не определяет уникальное решение - вам нужно будет сделать что-то вроде {x0.x''[0]==-1, x[0]==x0, x'[0]-x0 x0.x'[0]==v0}, чтобы это сработало (NDSolve все равно потерпит неудачу с той же ошибкой). Вы понимаете, что вы просто получите большой круг на сфере юнитов, верно?

Кстати, вот как я бы кодировал ваш пример:

x[t_] = Table[Subscript[x, j][t], {j, 3}];
s1 = NDSolve[Flatten[Thread /@ #] &@{
       x''[t] - (x''[t].x[t]) x[t] == {0, 0, 0},
       x[0] == {1, 0, 0}, 
       x'[0] == {0, 0, 1}
     }, x[t], {t, -1, 1}]
...