![]() | ||||||
速度の積算 | ||||||
![]() | ||||||
速度を積算したイメージ図 |
A | B | C | D | E | F | |
1 | No | 速度 | 秒数 | 区間距離 | 距離累計 | 時間累計 |
2 | 1 | 速度1 | 時間1 | =B2*C2 | =D2 | =C2 |
3 | =A2+1 | 速度2 | 時間2 | ↓ | =E2+D3 | =F2+C3 |
4 | ↓ | : | : | ↓ | ↓ | ↓ |
表では「○○秒」のところがすべて2秒です。
この作表ならもちろん5秒などでもOKですが、実際に必要なるデータ処理では「○○秒おきに計測したデータ」という場合が一般的です。
最初から「○○秒おき」がわかっていれば(それが普通)、わざわざ秒の欄をつくったりしなくても十分計算できます。
ちなみに、この計算は当たり前なようで、計測や制御の分野などでよく使われています。
数学的には積分に近いため、後述のような数値演算に用いられます。
さて、実際にこの表のように、速度がすぱっと変わるかというと物理的にはあり得ません。
おそらくは、右図の破線のような感じで速度が徐々に増え、一定になり、徐々に減る、というような加減速の過程を2秒おきにはかったら、◆印のデータが得られた、ということです。
しかし、データはこれしかないので、とりあえず、水色の階段状の速度変化を仮定して、縦長の短冊にばらして加えていったのが上の表です。
どうみてもずれがありますが、細かいことは後述します。
蛇足:
工学部だったら「秒速○○メートル」といったときに、「あ、あのくらいか」と思い浮かぶのが望ましいです。
ちなみに、歩く速度が 1[m/s]強(時速4キロ)です。世界最速の人が走って10[m/s](時速40キロ弱)。
![]() |
差分 |
A | B | C | D | E | |
1 | 時刻 | 位置 | 移動量 | 経過時間 | 速度 |
2 | 時刻1 | 位置1 | |||
3 | 時刻2 | 位置2 | =B3-B2 | =A3-A2 | =C3/D3 |
4 | : | : | ↓ | ↓ | ↓ |
これも、通常は「一定の時間間隔で計測」することが多く、その場合は経過時間が一定となるため、割り算も定数ですみます。
この計算もまた、計測制御の分野で実際によく使われる演算で、微分の代わりにも用いられます。
なお、差や速度の結果である、C〜E列で、2行目があけてあります。
これは趣味の問題で、3行目以降を上に詰めてもかまいません。
こういう計算をするときには、「時間が下に向かって進む」ため、「左斜め下=気分的に時間が後ろ=未来」の値を使うような印象があるため、このような形にしています。
先ほどの積算の計算をする際、積算すべき対象を自分で関数で用意することで、その関数の定積分(に近い値)を計算することができます。
この手法を数値積分、積分の数値(計算)解と呼びます。
一方、微分積分学の講義で習うような、数式のやりくりだけで、最後に値を入れれば結果が出るような結果を解析解といいます。
基本的に解析解は数式変形上の正しさを保って行うため、値も正確です。
しかし、数値解は普通は後述のように誤差が生じます。
誤差は出ますが、解析解のように悩まなくても、そもそも解析解がない場合でも、そこそこ答えが得られることが最大の利点です。
実際に、ここでは積分してみましょう。
![]() |
y=2xの数値積分(0.1step) |
![]() |
y=2xの数値積分(0.1step) |
![]() |
y=2xの数値積分(0.01step) |
ここでは、先の例での時間にあたるxを一定の幅で増加させ、そのときのyを数式で与えます。
それ以外はいっしょです。
A | B | C | D | E | F | |
1 | ||||||
2 | Δx | 0.1 | ||||
3 | ||||||
4 | No | x | y=2x | yΔx | 積算 | y=x*x |
5 | 0 | =A5*$C$2 | =B5*2 | =C5*$C$2 | =D5 | B5*B5 |
6 | =A5+1 | ↓ | ↓ | ↓ | =E5+D6 | ↓ |
7 | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ |
![]() |
数値積分の誤差 |
ここで、短冊の横幅を細くしてみます。明らかにピンクの不足領域も、水色のはみ出しも小さくなっています。
これがΔxを小さくしたときに誤差が減る理由です。
![]() |
数値積分の誤差と計算方法 |
4番目の図は「短冊をやめて台形にした」です。これは明らかに効果がありそうです。
実際にその効果が認められて「台形積分」と呼ばれる計算方法です。
計算量が増えそうですが、「1本目の短冊の右の高さ(y)」と「2本目の短冊の左の高さ」は同じ値です。ので、
積分=(1左+1右)Δx/2+(2左+2右)Δx/2+..(n左+n右)Δx/2
=(Δx){1左/2+1右(=2左)+2右+...(n-1)右+n右/2}
となります。もとが、
積分=(Δx){1左+2左+...+n左}
なので、両端がすこし変わるだけです。途中の値がいらないなら、計算量がほとんど変わらないのに精度がよくなるという便利な方法です。
難点は、両端の例外部分(/2)を作り間違う可能性がある、というところです。
いまどきはコンピュータの速度が劇的に速いので、力任せにΔxを細かくしてすませる、も一つの手です。
![]() |
xsinx 0〜π の積分 |
まず、解析解を求めて置きます。
経過の理解は置いておいて、結果はπ=3.14159..です。
次にこれを数値計算できるように変換します。
積分は、先の積算の計算で、横軸の幅を限りなく細かくしたものに相当します。
限りなく狭い横幅dxを関数の値(xsinx)に掛けて積んでいったものです。
計算上は限りなく狭く、という訳にはいかないので、ここでは0〜πを100等分してみます。
A | B | C | D | |
1 | ||||
2 | Δx | =Pi()/100 | ||
3 | ||||
4 | No | x | y=xsin(x) | 積算 |
5 | 0 | |||
6 | 0 | =A6*$C$2 | =B6*Sin(B6) | =D5+C6*$C$2 |
7 | =A6+1 | ↓ | ↓ | ↓ |
8 | ↓ | ↓ | ↓ | ↓ |
この分割を細かくしていけば、当然精度はよくなりますが、表計算の上で手頃にできるのは100くらい、がんばっても実用になるのは1000分割くらいです。
それ以上細かくして計算精度を上げるには、計算法を見直す(台形積分をつかってみるとか)ことも一つですが、プログラムを書けば、このくらいの積分なら100万分割もわけなく計算できます。これはプログラミングのところで今後やることになります。
この計算は先に述べたように、解析解を求めるのが面倒/不可能(自分には、を含む)なときにそれらしい値を出してくれます。
加えて、「解析解を出せたけど、正しいかが疑わしい」という場合に、検算として使えますし、予めこのあたりの値と目安をつけておくと解析しやすい場合もあります。
そういう「セカンドオピニオン」としての数値解、覚えておくと便利です。
すくなくとも、私の場合は、大学時代には数学の宿題や、研究で必要な数式の確認のため、よく、この手を使っていました。
確実に、着実に結果を求めていく必要がある場合、「常に2系統以上の答えの出し方を考え、結果の一致を確認する」ことは非常に重要です。
余裕があればぜひやってみましょう
機械におけるコンピュータの応用事例で多いものにコンピュータシミュレーションがあります。
シミュレーションとは、検討を加えたい対象の挙動を決める各種方程式を元に、順次計算を行っていき、その結果を評価するものです。
これにより、実物での実験をすることなく、様々な結果を得ることができるほか、実物では計測し得ないデータを得ることもできます。
たとえば、
ここでは、シミュレーションを実例で確認してみます。
物体の運動は、
という運動方程式で表されます。言葉で書き直すと、
物体にかかる力=質量×加速度
です。加速度は、速度の瞬間的な時間変化、つまり位置を時間で2回微分したものになります。
逆にみると、
加速度は力を質量で割ったもの、となります。
ものの運動のシミュレーションの基本はこの式になります。
時々刻々と物体にかかる力(重力とか駆動力とか)を求め(or入力し)、加速度にします。
これを1回積分すると速度に、もう一回積分すると位置になります。
この積分は、上の数値積分の手法がそのまま使えます。
ただし、加速度が時々刻々と変化して速度や位置が変化する一方で、その時々刻々の位置、速度が力に影響する場合は、まとめてsumで計算する訳にはいかないので、積算していくことにします。
(たとえば、バネにおもりをつけて引っ張って離すと、バネののびに応じて力がかかり、その力で移動し、移動した位置に応じて力がかかる、というように、力と位置に相互の関係があります)
![]() |
抵抗のない自由落下 |
自由落下の式はおなじみの
です。これは、本来、
から時刻tで2回積分すると、
となって得られる式です。
これを試してみましょう。
まず、数式を書き換えます。
計算の間隔をΔtとして、Δtの間の速度でxを増やし、同様にvをaで、aは固定です。
A | B | C | D | E | |
1 | Δt | 0.01 | |||
2 | 重力g | 9.8 | |||
3 | |||||
4 | i | 時刻 t[s] | 落下位置 x[m] | 落下速度 v[m/s] | 加速度 a[m/ss] |
5 | 0 | =A5*$C$1 | 0 | 0 | =$C$2 |
6 | =A5+1 | ↓ | =C5+D5*$C$1 | =D5+E5*$C$1 | ↓ |
7 | ↓ | ↓ | ↓ | ↓ | ↓(300行くらい) |
ここで、x0,v0に相当する、C5,D5はただ「0」を書いてあるわけではありません。これは、「シミュレーション開始時点で位置がゼロ、速度もゼロとする」というシミュレーションの開始条件です。
たとえば、C5に「10」と書けば、位置が10のところからスタートしますし、今回は座標軸が下向きなので、D5(v0)に「−5」と書けば上向きに5の速度でスタート(下に-5)するので、投げ上げになります。
数表だけではわかりにくいため、グラフにして見やすくします。
シミュレーションによってはこの段階も重要で「可視化」といいます。結果があっても、膨大な数字のかたまりではわかりづらいので。
たんに、B〜E列で散布図のグラフにしています。(点付きのグラフを選ぶと表示が大変なので線のみがよい)
![]() |
空気抵抗のある自由落下 |
この式は簡単には積分できません。積分した結果のvがaの式に入っています。
こういうときには数値計算が便利です。
A | B | C | D | E | |
1 | Δt | 0.1 | |||
2 | 重力g | 9.8 | |||
3 | 抵抗 | 0.01 | |||
4 | i | 時刻 t[s] | 落下位置 x[m] | 落下速度 v[m/s] | 加速度 a[m/ss] |
5 | 0 | =A5*$C$1 | 0 | 0 | =$C$2-$C$3*D5*D5 |
6 | =A5+1 | ↓ | =C5+D5*$C$1 | =D5+E5*$C$1 | ↓ |
7 | ↓ | ↓ | ↓ | ↓ | ↓ |
結果を見ると、速度があるところで一定になります。これはmgと空気抵抗が釣り合ったところで加速しなくなるためです。
そうでないと、雨もとんでもない速度で降ってくることになります(笑)。
ここで、C3の抵抗(上式の(RA/m)相当)を変えると、グラフの形が変わります。0にすれば抵抗なしで先ほどの式と同じ、位置も放物線になります。
大きくすればするほど、早い段階で速度が一定になるようになります。
このように、ちょっとした数字の変更でいろいろな状況を作り出せるところもシミュレーションの魅力です。
ただ、「現実にはあり得ない状況」を作り出して満足してしまうこともあるのが怖いところで、常に気をつける必要があります。
![]() |
バネとダンパによる振動 |
![]() |
バネとダンパによる振動 |
![]() |
バネによる振動(ダンパなし) |
![]() |
数式を少し改良 |
A | B | C | D | E | |
1 | Δt | 0.01 | |||
2 | m | 1 | |||
3 | k | 1 | |||
4 | c | 0.5 | |||
5 | i | 時刻t[s] | 位置 x[m] | 速度 v[m/s] | 加速度 a[m/ss] |
6 | 0 | =A6*$C$1 | 1 | 0 | =-($C$3/$C$2)*C6-($C$4/$C$2)*D6 |
7 | =A6+1 | ↓ | =C6+D6*$C$1 | =D6+E6*$C$1 | ↓ |
8 | ↓ | ↓ | ↓ | ↓ | ↓(1000行くらい) |
さて、ここで、c=0、ありがちなバネの振動にしてみましょう。
そのとき、振動の周期は
となることを高校あたりで習っているかもしれません。で、実際グラフを見るとそうなります。
しかし、妙なところがあります。青線で表されている「位置」が、最初の1より若干大きくなっています。
常識の範囲では、長く振動し続けることはあっても、揺れが大きくなるはずはありません。
これはまさにシミュレーションの誤差です。誤差の要因は計算の誤差もありますが、一般には使った数式の問題です。
今回の例では、加速度→速度→位置と順に計算されるため、加速度から位置まで2Δtの時間差が生じ、悪影響が出ています。
そのため、Δtを小さくすれば誤差は減り、Δtを大きくすると誤差が大きくなります(試しに、Δt=0.1とかにすると大変なことに)。
ただ、Δtを小さくすることは計算の回数が増えることを意味し、特に表計算では限度があります。
もう一つの解決策として、数式の修正があります。たとえば、
A | B | C | D | E | |
6 | 0 | =A6*$C$1 | 1 | 0 | =-($C$3/$C$2)*C6-($C$4/$C$2)*D6 |
7 | =A6+1 | ↓ | =C6+D7*$C$1 | =D6+E6*$C$1 | ↓ |
8 | ↓ | ↓ | ↓ | ↓ | ↓(1000行くらい) |
![]() |
バネと摩擦による減衰振動 |
![]() |
摩擦のある場合 |
この条件分けの部分を作るには、
IF(条件式,条件成立の時の数式,条件不成立の時の数式)
を使います。今回は、
=-(k/m)x+IF(v>0,-μg,+μg)
に相当する数式を加速度に指定すればいいわけです。
ただ、こういう怪しげな条件を加えるほど、シミュレーションはどっかにいきやすくなります。Δt=0.01では、μを0.1程度にすると、得体の知れないグラフになります(右図はμ=0.01)。
今回の例では「静止摩擦」が入っていないことが一つの要因です。普通は、vの負号が変わるとき一度は停止するため、そこで静止摩擦に引っかかって最後は止まりますが、この式ではそれがありません。
入れてみるといいでしょう。IFの「(不)成立時の数式」に、またIFを使った数式もいれられます。
ただし、条件にv=0は使えません。計算誤差もありますが、ちょうどv=0になる時刻で計算するとは限りません。
そのため、たとえば、「|v|<小さな数字」などの条件を使います。
Excelでは「abs(v)<0.001」などにの条件式となります。
コンピュータの得意なことは計算です。
ですが、計算の仕方は教えなければなりません。
ここまでやってきたような計算は、かなり教えるべきことは少ない計算ですが、「○○の条件になる数値」、たとえば f(x)=0になるようなx(方程式の解)を求めようと思ったとき、その求め方を教えるのが難しいことがあります。
そういうときは、計算はコンピュータに任せ、直感的な判断をするのは人間がやる、という分業をする手があります。
基本的に、そういうばあい「こうだ」という明確な方法はあまりありません。
明確な方法があれば「教えられます」。
ここでは、実際の例をやってみます。
ある条件を満たす変数を探す、まさに方程式の解です。
なにか設計したりするときに、そういう計算が必要なことがあります。
ここでは、単純な3次方程式を題材に、解を求めてみます。
自分でやってみるための実習用方程式。例によって学生番号。
![]() |
とりあえずグラフを書いてみる |
![]() |
それらしい範囲を拡大する |
![]() |
細かく探していく |
方程式をf(x)=0とみます。この解は、グラフy=f(x)がy=0(x軸)と交わるところのxです。
で、まずはグラフを書いておおざっぱに見当をつけます。
見つけるべき特徴は、
yがプラスからマイナス、−から+に変わるところ
です。その間にy=0があるはずだからです。
グラフはとりあえず、xを適当な範囲で増やしつつ、対応するyを計算するようにして、グラフ化します。
A | B | |
1 | x | y |
2 | -10 | =A2*A2*A2-???*A2*A2+???*A2-??? |
3 | =A2+1 | ↓ |
最終的に、プラスとマイナスが変わるところを見つけます。
右の例では、xが3.9〜4.2, 5.1〜5.4, 8.1〜8.4の3カ所です。
ステップ2:細かく探していく。
とりあえず、3.9と4.2の間にあることはわかっているので、1桁ずつ見つけていきましょう。
さっきのB列の数式をそのままコピーしてきて、A列の値を手動でいれて、Bが0に近づくようにします。
ここでは、マイナス→プラスなので、yがマイナスだったらその上、yがプラスだったらxを大きくしすぎ、ということになります。
(プラス→マイナスだと逆傾向)
1: 3.9〜4.2では4.1〜4.2らしい
2: 4.12ちょいくらい?
3: 4.123でyが1.3×10の-7乗とかなり小さいので、これでいいことにしてみる。
どこまで繰り返すかは、どこまで正確な数字が必要か、ということになります。
バカらしい方法に見えますが、とりあえず値が必要、というときはわりと便利な方法です。
![]() |
二分法でコンピュータに計算させる |
そこで、以下の方法を使います。
A | B | C | D | E | F | |
1 | xd | y=f(xd) | xd | y=f(xd) | xd | y=f(xd) |
2 | xd初期 | =A2*A2*A2.. | =(A2+E2)/2 | =C2*C2*C2.. | xu初期 | =E2*E2*E2.. |
3 | =IF(B2*D2<0,A2,C2) | ↓ | ↓ | ↓ | =IF(D2*F2<0,E2,C2) | ↓ |
4 | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ |
「B2*D2<0」はxdとxuの間をxm区切ってみて、そのxd側に答えがある、ということを意味します。そのため、次のチェック範囲はxdとxmの間なので、そのままxdを使います。一方、「そうでなければ」の条件は、チェック範囲がxmとxdの範囲になります。 つまり、いまのxdは捨てて、今度はxmをxdの代わりに使って、同じチェックをすればいいわけです。なので、xmであるC2を持ってきます。
この二分法は、1段の計算で、xの範囲は1/2に縮みます。10回もやれば、1/1000に、20回やれば100万分の1までいきます。
また、最初のxu,xdを設定し直せば一瞬で他の区間の答えも出ます。
手でxを調整するよりは、じつはこれのほうが効率がいいはずですが、上の作表を思いつくのに時間がかかりそうなら、手動調整のほうが速いのも確かです。
ちなみに、区間内に複数の答えがあった場合には、適当に1個が見つかります。その意味で、ステップ1のグラフであたりをつける、が重要になります。
また、xd,xm,xuのうち2つは次段に引き継ぐので、一緒に対応するf(xd),f(xm),f(xu)も引き継ぐと、f(x)が複雑な時などにはスピードアップが期待できます。
時と場合で手段を切り替えることもまた、コンピュータを使いこなす秘訣です。
![]() |
車輪移動ロボット |
ここでは、ロボットの車輪の回転速度を時々刻々と与えると、ロボットの挙動が出てくるように、計算式を並べています。
この計算をつかうと、本物のロボットの車輪の時々刻々のデータから、ロボットが今どこにいるかを推定することもできますし、ロボットを動かしてみなくても、大まかな動きを検討することができます。
ファイルを用意しておきますので、興味があれば、試してみるといいでしょう。
車輪ロボシミュレータ (2007/10/26, 66,048 bytes)
使い方:C列D列に左右の車軸の回転速度を入れます。
![]() |
振り子 |
![]() |
振り子シミュレーション例 |
振り子は、以下の解説に示すように、振り子の向いている角度θ(真下で0,真横で±π/2[rad])について、
または、
(単に角速度ωを用意して、分解しただけ)
という関係が成り立ちます。
この振り子の運動をシミュレートし、みてわかるような結果でグラフ化してください。
なお、振り子の初期角度は「80+学籍番号下一桁[deg]」(80〜89)、振り子の長さは「3+学籍番号百の位」(4or5)でつくってください。
※角度はdegからradに変換しないといけない。<θは必ず[rad]
課題番号r03、ファイルはxls形式、"r03_学生番号.xls"にて、 期限は11月9日 。
講義中に出た質問から
振り子が角度θ傾いているとします。
このとき、振り子には、θを減らす方向に力mgsinθがかかります。
振り子のその瞬間の速度をvとすると、f=maに当てはめて、
振り子は半径が振り子の長さlの円周状を動くため、その速度は傾く速度(角速度)ω×lとなります(円周の長さ=半径×角度、を両辺とも時間で微分)。
ついでにmもとってしまうと
よって、
今回のレポートでは使いませんが、問題を簡単にする場合は、θが十分小さければsinθとθがほとんど同じとして、
と近似します。その場合、たとえば、
がこの式を満たします。
このページここで終了。