使用Mathematica的表函数创建点

时间:2011-05-15 04:47:06

标签: wolfram-mathematica

我正在尝试绘制我在mathematica表格中创建的点,但由于某种原因,我的点的一个组成部分似乎有围绕它的双括号,而另一个只有一个如下:

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

并且列表图不会将这些识别为点,也不会绘制它们。 这是我的mathematica代码:

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 个答案:

答案 0 :(得分:2)

你可以尝试这些方法:

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 :(得分:1)

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

答案 2 :(得分:1)

可以说有更好的方法来完成你正在做的事情,但这不是你所要求的。

要删除额外的{},请认识到这来自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];

答案 3 :(得分:1)

我的同事们是对的,但我认为可以说更多。首先,对你的实际问题。 NDSolve的输出是表单

的列表
{{x[t]->InterpolatingFunction[...]}, {x[t]->InterpolatingFunction[...]}, ...}

如果存在多个解决方案,则仅存在第二个和后续替换规则。我从未遇到过使用NDSolve的案例,但这样做的答案与Solve一致,其中多个解决方案并不少见。因此,只有一个解决方案,你有一个双重列表,即

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

根据Mr. Wizard,您可以使用First,也可以使用Part,即

NDSolve[ ... ][[ 1 ]]

这是我首选的方法,虽然它稍微难以阅读并且可能会模糊您的意图。您应该知道NDSolve返回的InterpolatingFunction是一个函数,它将直接接受变量。那么,声明左侧的变量

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

Belisarius

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

充其量是多余的,第二个要求每次使用xr时都要进行替换。相反,您可以声明

x = x[t] /. s

然后再写x[t]将返回IntepolatingFunction[t],完全符合您的要求。然后,当Belisarius指出时,您可以直接在Plot中使用它或其衍生物,而不是首先构建值表并将它们输入ListPlot

修改:当我第一次发布此内容时,我没有注意到NDSolve的怪癖。如果您明确解决了x[t]而不是x,那么NDSolve会返回InterpolatingFunction[...][t],但如果您只是求解x,则会得到我发布的内容。这个怪癖允许OP和Belisarius的解决方案发挥作用,否则不应该进行替换。