!!data
ColumnForm[ReadList["!head -10 data", String]]
0.1297323638545699 0.1323127172826521 0.1446228546294113 0.183239867688719 0.198061867847468 0.05509711267392398 0.1985483328594587 0.1346524383988073 0.1889659938776106 0.1923841700160055
Unixコマンドをしばしば実行する場合は, 次のような関数を定義しておくと便利です.
Unix[command_String] := Scan[Print, ReadList["!"<>command<>"|expand", String]]
Unix["wc -w data"]
128 data
data = ReadList["data", Number];
各行に複数のデータがある場合の例です.次のようなファイルがあるとします.
!!data2
1 2 3 4 5 6 7 8
data2 = ReadList["data2", Number]
{1, 2, 3, 4, 5, 6, 7, 8}
data2 = ReadList["data2", Number, RecordLists->True]
{{1, 2, 3}, {4, 5}, {6, 7, 8}}
!!data3
1, 2, 3 4, 5 6, 7, 8
data3 = ToExpression[
ReadList["data3", Word, RecordLists->True,
WordSeparators->{" ", "\t", ","}]]
{{1, 2, 3}, {4, 5}, {6, 7, 8}}
data
data // Short
{0.1297323638545699, <<126>>, 0.1183108049642118}
常に簡略化した表示にしたければ
$PrePrint = Short
Short
$PrePrint =.
次のようにStatistics`DescriptiveStatistics`パッケージを 利用しても求められますが,直接求めるのも簡単にできます.
Needs["Statistics`DescriptiveStatistics`"]
Mean[data] (* パッケージを利用 *)
0.397853
Plus @@ data / Length[data] (* 直接求める *)
0.397853
ListPlot[data]
-Graphics-
実際の x-座標が1, 2, 3, ... なら良いのですが, そうでない場合はx座標とy座標の対のリスト {{x1,y1}, {x2,y2}, ..., {xn,yn}} を ListPlotに与えてやる必要があります. 今,xi = x0 + (i-1)dx だとすると,x-座標なしのリストから x-座標付きのリストへの変換は以下のようにしてできます. Table[expri, {i, n}] は, リスト {expr1, expr2, ..., exprn} を返す関数です. data[[i]] は,リストdataの第i要素を表します.
Table[{x0+(i-1)dx, data[[i]]}, {i, Length[data]}]
Transpose[{x0+dx Range[0,Length[data]-1], data}]
これを関数として定義してみましょう.
AddXcoord[list_, x0_, dx_] :=
Transpose[{x0+dx Range[0,Length[list]-1], list}]
:= と = の違いは,右辺を評価するかどうかの違いです. = は右辺を評価した結果を左辺に代入します. := は右辺を評価せずに左辺に代入します. 関数が実行されたときに初めて右辺を評価します. 以下の例を見て下さい.
a = 10
10
f1[x_] := x+a (* x+a が代入されます *)
f2[x_] = x+a (* x+10 が代入されます *)
10 + x
a = 20 (* aを20に変更 *)
20
f1[x]
20 + x
f2[x]
10 + x
AddXcoord[list_, x0_, dx_:1] :=
Transpose[{x0+dx Range[0,Length[list]-1], list}]
AddXcoord[{10,11,12}, 1]
{{1, 10}, {2, 11}, {3, 12}}
datax = AddXcoord[data, -2, 1./32]
Transpose[datax][[2]]
ListPlot[datax]
-Graphics-
ListPlot[datax, AxesOrigin->{-2,0},
AspectRatio->Automatic]
-Graphics-
fit1[x_] = Fit[datax, {1,x^2,x^4,x^6}, x]
2 4 6 1.034 - 1.39553 x + 0.628783 x - 0.0861296 x
求めた多項式は Plot[fit1[x], {x,-2,2}] でプロットできますが, ここでは,もともとのデータdataxのプロットと重ねて表示してみます. 複数のプロットを重ねて表示するには, Graphics`Graphics`パッケージにあるDisplayTogether関数を使います.
Needs["Graphics`Graphics`"] (* パッケージの読み込み *)
DisplayTogether[
ListPlot[datax],
Plot[fit1[x], {x,-2,2}],
AxesOrigin->{-2,0}, AspectRatio->Automatic
]
-Graphics-
graph1 = ListPlot[datax, DisplayFunction->Identity];
graph2 = Plot[fit1[x], {x,-2,2},
DisplayFunction->Identity];
Show[graph1, graph2, AxesOrigin->{-2,0},
AspectRatio->Automatic,
DisplayFunction:>$DisplayFunction]
-Graphics-
以降,たびたび重ねた表示を行うので,関数plotbothとして定義しておきます. plotboth[fit1]で上と同じプロットが得られます. ついでに2乗誤差を求める関数squareErrorも定義しておきましょう.
plotboth[f_] := Module[{x},
DisplayTogether[
ListPlot[datax],
Plot[f[x], {x,-2,2}],
AxesOrigin->{-2,0}, AspectRatio->Automatic
]]
squareError[f_] := Module[{i},
Sum[N[(datax[[i,2]]-f[datax[[i,1]]])^2],
{i,1,Length[datax]}]
]
squareError[fit1]
0.743927
Needs["Statistics`NonlinearFit`"] (* パッケージの読み込み *)
fit2a[x_] = a + b Exp[-(c x)^2]; (* あてはめる式を定義 *)
NonlinearFit[datax, fit2a[x], x, {a,b,c}]
{a -> 0.11288, b -> 1.01213, c -> 1.57377}
fit2[x_] = fit2a[x] /. % (* これが求める近似 *)
1.01213
0.11288 + -----------
2
2.47676 x
E
plotboth[fit2] (* プロットは省略 *)
squareError[fit2]
0.422073
NonlinearFitを使わなくても,y-座標データの Logを 計算すれば,Fitでももう少し良く近似できます.
dataxLog = Map[{#[[1]], Log[#[[2]]]}&, datax];
fit3[x_] = Exp[Fit[dataxLog, {1,x,x^2,x^3,x^4}, x]]
2
Power[E, 0.0576518 - 0.184933 x - 2.06158 x +
3 4
0.0110031 x + 0.40145 x ]
plotboth[fit3] (* プロットは省略 *)
squareError[fit3]
0.5461
FitFFT[data_, {x_,x0_:0,dx_:1}, m_] := Module[{n,f,k},
n = Length[data];
f = N[InverseFourier[data] / Sqrt[n]];
Re[f[[1]]] +
Sum[ 2 Re[f[[k+1]]] Cos[2 Pi k (x-x0) / (n dx)] -
2 Im[f[[k+1]]] Sin[2 Pi k (x-x0) / (n dx)] ,
{k,1,m} ]
]
fit4[x_] = FitFFT[data, {x,-2,1/32}, 3]
Pi (2 + x)
0.397853 - 0.442581 Cos[----------] +
2
0.216662 Cos[Pi (2 + x)] -
3 Pi (2 + x)
0.0506513 Cos[------------] +
2
Pi (2 + x)
0.0272171 Sin[----------] +
2
0.0056861 Sin[Pi (2 + x)] +
3 Pi (2 + x)
0.00208212 Sin[------------]
2
plotboth[fit4]
-Graphics-
squareError[fit4]
0.378544
datax >> "tmp1" (* ファイル tmp1 に保存 *)
newdatax = << "tmp1" (* ファイル tmp1 から読み込み *)
datax == newdatax (* dataxとnewdataxは等しい *)
True
!!tmp1
WriteArray[file_, array_List] := Module[{stream},
stream = OpenWrite[file, PageWidth->Infinity];
Scan[WriteToStream[stream, #]&, array];
Close[stream];
]
WriteToStream[stream_, list_List] := Block[{},
If[ Length[list] > 0,
WriteString[stream, First[list]];
Scan[WriteString[stream, "\t", #]&, Rest[list]]
];
WriteString[stream, "\n"];
]
WriteToStream[stream_, x_] := Write[stream, x]
WriteArray["tmp2", datax]
!!tmp2
最初に戻る
前へ