Создание точек при использовании табличной функции Mathematica - PullRequest
2 голосов
/ 15 мая 2011

Я пытаюсь построить точки, которые я создал, в таблице в Mathematica, но по какой-то причине один компонент моих точек, кажется, имеет двойные скобки вокруг него, в то время как другой компонент имеет только одну, как показано ниже:

{{x},y},{{x1},y1}....{{xn},yn}

и список графика не распознает их как точки и не будет строить их.Вот мой код математики:

Remove["Global`*"]
b = .1;
w = 1;
Period = 1;
tstep = 2 Pi/Period;
s = NDSolve[{x''[t] + b x'[t] - x[t] + x[t]^3 - .5 Cos[w t] == 0, 
 x'[0] == 0, x[0] == 0}, x[t], {t, 0, 1000}, MaxSteps -> Infinity];
x[t_] = x[t] /. s
data = Table[Evaluate[{x'[t], .5}], {t, 0, 1000, tstep}]
ListPlot[data]

Я также пытался использовать команду

ListPlot[Flatten[Table[Evaluate[{x'[t], .5}], {t, 0, 1000, tstep}]]]

безрезультатно, а также

ListPlot[Table[Evaluate[{Flatten[x'[t]], .5}], {t, 0, 1000, tstep}]]]

Как я могуудалить {}?

Ответы [ 4 ]

2 голосов
/ 15 мая 2011

Вы можете попробовать что-то вроде этого:

Clear["Global`*"]
b = .1;
w = 1;
s = NDSolve[{x''[t] + b x'[t] - x[t] + x[t]^3 - .5 Cos[w t] == 0, 
    x'[0] == 0, x[0] == 0}, x[t], {t, 0, 1000}, MaxSteps -> Infinity];

xr[u_] := ((x[t] /. s[[1]]) /. t -> u)
Plot[(xr'[u]), {u, 0, 30}]  

enter image description here

Но я не уверен, что вы пытаетесь получить от {x'[t], .5} части

1 голос
/ 15 мая 2011

Мои коллеги правы, но я думаю, что можно сказать еще кое-что. Во-первых, к вашему актуальному вопросу. Вывод NDSolve представляет собой список вида

{{x[t]->InterpolatingFunction[...]}, {x[t]->InterpolatingFunction[...]}, ...}

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

{{x[t]->InterpolatingFunction[...]}}

Согласно Мистер. Мастер , вы можете использовать First, или вы можете использовать Part, т.е.

NDSolve[ ... ][[ 1 ]]

- это мой предпочтительный метод, хотя его немного сложнее читать и он может затенить ваши намерения. Вы должны знать, что InterpolatingFunction, который возвращает NDSolve, является функцией, и она будет принимать переменные напрямую. Итак, переменные в левой части объявлений

x[t_] = x[t] /. s

и от Велизарий

xr[u_] := ((x[t] /. s[[1]]) /. t -> u)

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

x = x[t] /. s

, а затем запись x[t] впоследствии вернет IntepolatingFunction[t], именно так, как вы хотите. Затем, как указывает Велизарий , вы можете использовать его или его производную непосредственно в Plot вместо того, чтобы сначала строить таблицу значений и вводить их в ListPlot.

Редактировать : когда я впервые опубликовал это, я не заметил причуды с NDSolve. Если вы явно решите для x[t], а не x, то NDSolve вернет InterpolatingFunction[...][t], но если вы просто решите для x, вы получите то, что я написал. Эта особенность позволяет использовать решения как ОП, так и Велизария, иначе замена не должна произойти.

1 голос
/ 15 мая 2011

Возможно, есть лучшие способы выполнить то, что вы делаете, но это не то, о чем вы просили.

Чтобы удалить лишние {}, узнайте, что это происходит из результата NDSolve, и, следовательно, используйте:

s = First @ NDSolve[{x''[t] + b x'[t] - x[t] + x[t]^3 - .5 Cos[w t] == 0, 
     x'[0] == 0, x[0] == 0}, x[t], {t, 0, 1000}, MaxSteps -> Infinity];
1 голос
/ 15 мая 2011

Скорее всего, x'[t] возвращает что-то вида {x_i}. Попробуйте заменить строку data=Table... на эту

data = Table[Evaluate[{First[x'[t]], .5}], {t, 0, 1000, tstep}]

Альтернативой было бы сделать

data=data /. {{x_}, y_} :> {x, y};

, который использует ReplaceAll (/.) для замены каждого вхождения {{x_i},y_i} на {x_i,y_i}

Пример:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...