【ネタバレなし】アルジャーノンに花束を(おすすめ小説・あらすじと感想)
こんてんつ
小説アルジャーノンに花束を紹介します。
あらすじ
物語の主人公は、知的障害を抱える32歳のチャーリイ・ゴードン。IQにすると6歳児並の大人でした。
そんな彼は「賢くなりたい」という欲求を持ち続け、ある日、画期的な脳手術を受ける機会が訪れます。
彼は、すでに同じ手術で驚くべき成果を出しているハツカネズミのアルジャーノンと、ライバルとして知的作業の勝負を繰り返し行います。
脳手術の効果は抜群であり、チャーリイのIQは指数関数的に上がっていきます。彼の人生は劇的に変わり始めるのです。
知性を持つことは、幸せになることと本当にイコールなのでしょうか? これは、私たちが読み進める中で向き合うことになる、深く、重い問いです。
おすすめポイント
是非、サンプルから最初の数ページを読んでほしい。この本は、チャーリイが書く手術の経過報告の日記形式で進みます。
最初は、誤字やひらがなだらけの文章。すると、知性が向上するにつれ文章が劇的に変化していきます。
この文章の変化を体験できること自体が、この本のユニークさであり、同時に恐ろしさも感じられる魅力の一つです。
感想
知性が高まると、同時にこれまで見えてこなかった「残酷な真実」が見え始めます。
賢くなればなるほど、彼は周りから理解されなくなり、深い孤独に苛まれていきます。
この物語は、単に「知性が増す」話ではなく、「孤独とは何か」「愛とは何か」を深く問いかけてきます。
統計学習者に向けたオススメ書籍
こんてんつ
こちらのページでは統計初学者に向けたオススメ参考書を紹介しています。
書籍紹介
オススメ書籍1:統計学入門 (基礎統計学Ⅰ)
こちらは、多方面から名著と名高い書籍です。ただ、全くの初心者には向かないと思います。本書は統計学の基礎を一通り触ったことがある人向けだと思っています。一通り見聞きしたことある人が、もう一度しっかり身に着けるために読むなどの使い方が良いのではないかと考えています。
また、本ブログでは、本書の解答集を作成しています。必要に応じて参照頂けますと幸いです。
オススメ書籍2:完全独習 統計学入門 小島 寛之 (著)
こちらは、完全に初学者向けの教科書です。私は大学の研究室時代に、教授にここから始めなさいと言われました。標準偏差や分布に自信が無い方はこちらから始めてみては如何でしょうか?
オススメ書籍3:生物学を学ぶ人のための統計のはなし 粕谷 英一 (著)
こちらは、生物学・健康学・医学などの分野で活動する人向けの参考書です。これらの分野では、検定や有意差などの議論が求められます。そのような時に困らないようにするための参考書です。生物学などを専攻する方はこれを参考にしてみて下さい。
片持ち梁・両持ち梁の固有振動数の公式と導出
こんてんつ
梁の固有振動数(共進周波数)の式を導出する。
- 結論
- 導出
- 梁の横振動の支配方程式の導出
- 微分方程式一般解の導出
- 具体的な固有振動数の導出
- 片持ち梁 固定–自由
- 片持ち梁 ピン–自由
- 両持ち梁 固定–固定
- 両持ち梁 ピン–ピン
- 両持ち梁 固定–ピン
結論
梁の横振動の支配方程式
微分方程式の一般解
の値
| 支持条件 | |
|
|
|---|---|---|---|
| 片持ち梁 固定–自由 | 1.8751 | 4.6941 | 7.8548 |
| 片持ち梁 ピン–自由 | 3.9266 | 7.0686 | 10.2102 |
| 両持ち梁 固定–固定 | 4.7300 | 7.8532 | 10.9956 |
| 両持ち梁 ピン–ピン | π ≈ 3.1416 | 2π ≈ 6.2832 | 3π ≈ 9.4248 |
| 両持ち梁 固定–ピン | 3.9266 | 7.0686 | 10.2102 |
導出
梁の横振動の支配方程式の導出
任意の梁の微小長さに働く
- 慣性力
- せん断力
のつり合いを考える。

慣性力は断面積
、単位長さ当たりの密度
、縦弾性係数
、断面二次モーメント
を用いて、
と表せる。一方せん断力は、微小領域の左右のせん断力の差として表されるため、断面の左右の位置でのせん断力の変化を考慮して、
となる。一方で、せん断力は曲げモーメント
の変化率であるから、
であること、加えて梁のたわみの微分方程式から、
である。これらを用いて、
よって、と
のつり合いより、Euler-Bernoulli 梁理論における横振動の支配方程式、
が得られる。
微分方程式一般解の導出
振動モードを考えるために、一般解を「空間依存
」と「時間依存
」で変数分離された形
になると仮定する。振動時の梁の節や腹を表すような空間依存の一般解が分かれば良く、これを支配方程式に代入すると、
となる。ここで、
と置いた。得られた微分方程式は、線形斉次微分方程式である。特性方程式を求めるためにと置くと、
となる。線形斉次微分方程式の解の重ね合わせの原理により、
となるが、実関数の方が扱いやすいため
より、
が得られ、同様に、
より、
が得られる。よってこれらを重ね合わせた、
が微分方程式の解となる。
具体的な固有振動数の導出
片持ち梁(固定-自由)の固有値
梁の長さをと置く。梁の一端が固定されており、もう一端が自由端の時、支持側の変位0、傾き0より、
自由端側のモーメント、せん断力
より、
となる。これより、
が得られる。よって、
であり、この連立一次方程式が非自明な解を持つ条件は、係数行列が正則でないこと、言い換えれば行列の行列式がゼロになることであり、
より、これを計算すると、
を得る。この超越方程式を解析的に解くのは困難であり、数値計算で解を求めると、第一モード、第二モード、第三モードとして、
となることが知られている。この時の固有振動数は、
片持ち梁(ピン-自由)の固有値
梁の長さをと置く。梁の一端がピン支持、もう一端が自由端の時、支持側の変位0、モーメント0より、
自由端側のモーメント、せん断力
より、
となる。これより、
が得られる。よって、
であり、この連立一次方程式が非自明な解を持つ条件は、係数行列が正則でないこと、言い換えれば行列の行列式がゼロになることであり、
より、これを計算すると、
を得る。この超越方程式を解析的に解くのは困難であり、数値計算で解を求めると、第一モード、第二モード、第三モードとして、
となることが知られている。この時の固有振動数は、
両持ち梁(固定-固定)の固有値
梁の長さをと置く。梁が固定支持の時、両端で変位0、傾き0より、
となる。これより、
が得られる。よって、
であり、この連立一次方程式が非自明な解を持つ条件は、係数行列が正則でないこと、言い換えれば行列の行列式がゼロになることであり、
より、これを計算すると、
を得る。この超越方程式を解析的に解くのは困難であり、数値計算で解を求めると、第一モード、第二モード、第三モードとして、
となることが知られている。この時の固有振動数は、
両持ち梁(ピン-ピン)の固有値
梁の長さをと置く。梁の両端がピン支持の時、支持側の変位0、モーメント0より、
となる。これより、
が得られる。よって、
であり、この連立一次方程式が非自明な解を持つ条件は、係数行列が正則でないこと、言い換えれば行列の行列式がゼロになることであり、
より、これを計算すると、
を得る。この超越方程式を解くと、 (nは自然数)となる。よって、第一モード、第二モード、第三モードとして、
となる。この時の固有振動数は、
両持ち梁(固定-ピン)の固有値
梁の長さをと置く。梁の一端が固定支持、もう一端がピン支持の時、支持側の変位0、傾き0より、
ピン支持側の変位0、モーメント0より、
となる。これより、
が得られる。よって、
であり、この連立一次方程式が非自明な解を持つ条件は、係数行列が正則でないこと、言い換えれば行列の行列式がゼロになることであり、
より、これを計算すると、
を得る。この超越方程式を解析的に解くのは困難であり、数値計算で解を求めると、第一モード、第二モード、第三モードとして、
となることが知られている。この時の固有振動数は、
【R】時系列データのサンプル作成
こんてんつ
時系列データのサンプルを簡易的に用意する方法を記述する。今回は、timeとvalueの値を持つサンプルを作成する。
- 乱数生成を使った作戦
- data.frameでベタ打ち作戦
- csvファイルから読み込む作戦
- (補足)mm:ss形式の行を追加する方法
乱数生成を使った作成
コード
dat <- data.frame( time = runif(30, min = 0, max = 300), value = rnorm(30) ) %>% arrange(time) %>% mutate(time = round(time, digits = 2), value = round(value, digits = 2)+time*0.05)
出力
time value 24.73 1.2765 35.25 2.8025 40.4 1.85 41.61 1.3005 76.63 4.2915 85.84 1.632 117.06 5.493 134.09 5.9745 137.32 6.436 138.69 6.2945 142.5 6.515 154.26 7.923 155.73 7.4765 168.1 8.905 192.52 10.946 197.1 11.065 211.52 12.476 215.73 10.5265 220.98 9.269 249.13 10.0165 250.8 11.17 271.21 11.8405 271.72 14.346 274.44 14.362 280.4 12.26 281.12 13.776 282 14.56 284 11.79 293.47 15.3735 296.67 13.9835
解説
runif(30, min = 0, max = 300)は0から300の範囲で30個のランダムな値を生成する。rnorm(30)は正規分布から30個のランダムな値を生成する。data.frameは一般的には、次の形で利用する。
# データフレームの作成 my_data <- data.frame( Name = c("Alice", "Bob", "Charlie"), Age = c(25, 30, 22), Score = c(95, 89, 75) ) # 作成したデータフレームの表示 print(my_data) #出力 Name Age Score 1 Alice 25 95 2 Bob 30 89 3 Charlie 22 75
その他、arrange(time)でtimeの昇順にソートを行っている。また、mutateとround()で四捨五入をして丸めている。
data.frameでベタ打ち作戦
コード
dat <- data.frame( time = c(24.73, 35.25, 40.4, 41.61, 76.63, 85.84, 117.06, 134.09, 137.32, 138.69, 142.5, 154.26, 155.73, 168.1, 192.52, 197.1, 211.52, 215.73, 220.98, 249.13, 250.8, 271.21, 271.72, 274.44, 280.4, 281.12, 282, 284, 293.47, 296.67), value = c(1.2765, 2.8025, 1.85, 1.3005, 4.2915, 1.632, 5.493, 5.9745, 6.436, 6.2945, 6.515, 7.923, 7.4765, 8.905, 10.946, 11.065, 12.476, 10.5265, 9.269, 10.0165, 11.17, 11.8405, 14.346, 14.362, 12.26, 13.776, 14.56, 11.79, 15.3735, 13.9835) )
csvファイルから読み込む作戦
コード
dat <- read.csv("mydata.csv")

(補足)mm:ss形式の行を追加する方法
dat %>% mutate(time_mmss = sprintf("%02d:%02d", time %/% 60, round(time %% 60))) %>% select(time, time_mmss, value)

【R】秒単位で整理された時系列データをmm:ss形式でグラフプロットする
こんてんつ
時系列データをプロットしたいとき、データは秒で整列されているが、グラフの横軸はmm:ssの表示の方が見やすい場合がある。その時に使える方法を紹介する。
チートシート
コード
dat %>% ggplot(aes(x = time, y = value)) + geom_line() + scale_x_continuous(labels = function(x) sprintf("%02d:%02d", as.integer(floor(x / 60)), as.integer(x %% 60))) + labs(x = "Time (mm:ss)",y = "Value")
出力

サンプルデータ
time value 24.73 0.5346 35.25 1.745 40.4 0.978 41.61 1.6122 76.63 1.9926 85.84 4.3768 117.06 2.7012 134.09 3.4118 137.32 3.1764 138.69 3.4138 142.5 3.46 154.26 3.2952 155.73 3.4246 168.1 3.862 192.52 5.1704 197.1 5.152 211.52 6.1304 215.73 4.5746 220.98 6.1996 249.13 7.4226 250.8 6.386 271.21 7.1442 271.72 6.1944 274.44 6.1288 280.4 7.368 281.12 5.9024 282 6.1 284 8.09 293.47 6.5694 296.67 6.7834
【R】データフレームの特定の列を四捨五入する方法(mutate、round)
こんてんつ
データフレームの列を指定して四捨五入したい場面がある。その時につかえるコマンドを紹介する。
チートシート
コード
dat %>% mutate(time = round(time, digits = 2))
解説
roundで、指定した列(time)を小数第二位まで(digits = 2)で丸めている。mutateと組みあわせることで置換することができる。
サンプルデータ
#四捨五入前 time value 1.092821988 0.908130569 4.295000131 -0.668832741 5.590229016 0.049779323 6.653013057 1.188054982 16.35518947 -0.322950312 38.88655601 0.219548011 47.25476343 -0.609888171 50.61970835 0.201942437 53.95446466 0.370294421 57.29383249 -1.113040194 66.27735144 -0.090865006 103.8869736 -0.194863607 108.6246822 -0.012996542 117.4398822 -1.246182062 148.4241006 0.42119744 148.4321235 -1.032527137 149.7821984 1.016773978 161.2059699 -0.764005911 186.8323629 -0.509764512 190.914034 0.279108394
#四捨五入後 time value 1.09 0.908130569 4.3 -0.668832741 5.59 0.049779323 6.65 1.188054982 16.36 -0.322950312 38.89 0.219548011 47.25 -0.609888171 50.62 0.201942437 53.95 0.370294421 57.29 -1.113040194 66.28 -0.090865006 103.89 -0.194863607 108.62 -0.012996542 117.44 -1.246182062 148.42 0.42119744 148.43 -1.032527137 149.78 1.016773978 161.21 -0.764005911 186.83 -0.509764512 190.91 0.279108394
【R】分:秒(mm:ss)の様な入力を、秒に変換する関数
こんてんつ
10:10の様なmm:ssの入力を、610秒の様な秒に変換する関数を紹介する。
チートシート
関数
to_seconds <- function(input_time) { time_parts <- strsplit(input_time, ":")[[1]] minutes <- as.integer(time_parts[1]) seconds <- as.integer(time_parts[2]) total_seconds <- minutes * 60 + seconds return(total_seconds) }
使用例
print(to_seconds("10:10"))

解説
strsplit(time, ":")[[1]]の[[1]]の意味について解説する。strsplit(time, ":")[[1]]は"10:10"の様な入力を、c("10", "10")に変換する。strsplit(time, ":")はリストを返し、[[1]]を付けることで、リストの最初の要素の値を返すことになる。具体的には、
> strsplit("10:10", ":") [[1]] [1] "10" "10" > strsplit("10:10", ":")[[1]] [1] "10" "10"