[[20211026000821]] 『斜方投射のシミュレーションのマクロができません』(にゃおごろん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『斜方投射のシミュレーションのマクロができません』(にゃおごろん)

先程ご解答くださったみなさまありがとうございました。
おかげさまで問題点に気づき解決することができました。本当にありがとうございました。

斜方投射のシミュレーションのマクロ作成が思うように進まないためご教示お願いします、
打ち上げ角度から位置を求める際、今は愚直にルートを用いた式で計算しているのですが、結果を見るにどこか間違っているようなのですがわかりません。
かつ、できることならたとえどんな角度でも計算できるようにするべきだと担当教員から言われたのですが、その方法が思いつきません。
水平位置を求めた時に、なぜか途中で途切れてしまいます。

==============================
初期値 垂直位置 0 水平位置 0
設定値 "重力
加速度" 9.8 初速度 25 "打ち上げ
角度" 45
時間設定 終了時間 5 時間間隔 0.1

時間 t 垂直位置 水平位置
0 0 0
0.1 17.62866953 1.767766953
0.2 35.11033906 35.35533906
0.3 52.34700859 53.03300859
0.4 69.24067812 70.71067812
0.5 85.69334765 88.38834765
0.6 101.6070172 106.0660172
0.7 116.8836867 123.7436867
0.8 131.4253562 141.4213562
0.9 145.1340258 159.0990258
1 157.9116953 176.7766953
1.1 169.6603648 194.4543648
1.2 180.2820344 212.1320344
1.3 189.6787039 229.8097039
1.4 197.7523734 247.4873734
1.5 204.4050429 265.1650429
1.6 209.5387125 282.8427125
1.7 213.055382 300.520382
1.8 214.8570515 318.1980515
1.9 214.8457211 335.8757211
2 212.9233906 353.5533906
2.1 208.9920601 371.2310601
2.2 202.9537297 388.9087297
2.3 194.7103992 406.5863992
2.4 184.1640687 424.2640687
2.5 171.2167382 441.9417382
2.6 155.7704078 459.6194078
2.7 137.7270773 477.2970773
2.8 116.9887468 494.9747468
2.9 93.45741636 512.6524164
3 67.03508589 530.3300859
3.1 37.62375542 548.0077554
3.2 5.125424949 565.6854249
3.3 -30.55790552 583.3630945
3.4 7.232679959
3.5 7.44540584
3.6 7.658131721
3.7 7.870857602
3.8 8.083583483
3.9 8.296309364
4 8.509035245
4.1 8.721761126
4.2 8.934487008
4.3 9.147212889
4.4 9.35993877
4.5 9.572664651
4.6 9.785390532
4.7 9.998116413
4.8 10.21084229
4.9 10.42356818
5 10.63629406

===================================

Sub 斜方投射()

    '初期値
    初期垂直位置 = Cells(1, 3).Value
    初期水平位置 = Cells(1, 5).Value
    '設定値
    重力加速度 = Cells(2, 3).Value
    初速度 = Cells(2, 5).Value
    打ち上げ角度 = Cells(2, 7).Value
    '時間設定
    終了時間 = Cells(3, 3).Value
    時間間隔 = Cells(3, 5).Value
    '繰り返し回数の初期設定
    回数 = 1
    '初期状態表示
    Cells(6, 1).Value = 0
    Cells(6, 2).Value = 初期垂直位置
    Cells(6, 3).Value = 初期水平位置

    '計算
     For 時間 = 時間間隔 To 終了時間 Step 時間間隔
         垂直位置 = 垂直位置 + 初速度 * 2 ^ (1 / 2) / 2 - 1 / 2 * 重力加速度 * 時間間隔 * 時間間隔
         水平位置 = 水平位置 + 初速度 * 2 ^ (1 / 2) / 2 * 時間間隔
         Cells(6 + 回数, 1).Value = 時間
         Cells(6 + 回数, 2).Value = 垂直位置
         Cells(6 + 回数, 3).Value = 水平位置
         回数 = 回数 + 1

    If 垂直位置 > 0 Then Exit For

    Next 時間

End Sub
==============================

長くなってしまい申しわけありませんが、ご教示のほどよろしくお願いいたします。

< 使用 Excel:Excel2016、使用 OS:unknown >


位置を示す式が間違っています。半平太さんの示された式を使ってください。
(端数誤差への対応でしょうか、時間間隔*回数で時刻を計算しています。)
また、速度を v*cos(θ),v*sin(θ)とX軸方向とY軸方向に分解して適用する必要があります。
計算する際は、角度はラジアンに変換することに注意してください。
# これじゃ課題の学習にならないかもしれませんね。
(γ) 2021/10/26(火) 08:48

計算式に間違いが結構あるのでまずは公式を確認したほうがいいかと思います
(砂糖) 2021/10/26(火) 09:10

 回答ではありません。余談を重ねますが、
 物理の課題なのか情報の課題なのかわかりませんが、

 浮動小数点数 xを x0 から xt まで dx 刻みで変化させるときのループ方法は

 Sub sample()
    Dim x As Double, x0 As Double, xt As Double, dx As Double
    x0 = 0
    xt = 10
    dx = 0.1
    For x = x0 To xt Step dx
        Debug.Print x
    Next
 End Sub

 よりも 

 Sub sample2()
    Dim x As Double, x0 As Double, xt As Double, dx As Double
    Dim I As Long, eps As Double
    x0 = 0
    xt = 10
    dx = 0.1
    eps = 0.0001 ' とりあえず十分小さい数
    For I = Int(x0 / dx + eps) To Int(xt / dx + eps)
        x = I * dx
        Debug.Print x
    Next
 End Sub

 の方がいいですよって話は、学校じゃ教えないんですかね?
 まだそれを教えるところまで段階が進んでない?のかな?
(´・ω・`) 2021/10/26(火) 09:32

 >水平位置を求めた時に、なぜか途中で途切れてしまいます。
 表示エリアは、最初にクリアしておかないと、
 以前のデータ(多分間違ったもの)が残ってしまうことがあります。

 >どんな角度でも計算できるようにする
 三角関数を使ってください。角度はラジアンに変換する必要があります。

 時間間隔が0.25なら、2進数と完全合致するので小数演算誤差は発生しないが、
 0.1の間隔だと、どこで誤差が発生して悪さをされるか予想がつかないので、
 ループカウンターは整数になるようにしておいた方が無難。

 Sub 斜方投射()
     '初期値
     初期垂直位置 = Cells(1, 3).Value
     初期水平位置 = Cells(1, 5).Value
     '設定値
     重力加速度 = Cells(2, 3).Value
     初速度 = Cells(2, 5).Value
     打ち上げ角度 = Cells(2, 7).Value
     '時間設定
     終了時間 = Cells(3, 3).Value
     時間間隔 = Cells(3, 5).Value
     '繰り返し回数の初期設定
     回数 = 1
     '初期状態表示
     Cells(6, 1).Value = 0
     Cells(6, 2).Value = 初期垂直位置
     Cells(6, 3).Value = 初期水平位置

     パイ = Application.Pi()
     垂直等速度 = 初速度 * Sin(打ち上げ角度 * パイ / 180)
     水平等速度 = 初速度 * Cos(打ち上げ角度 * パイ / 180)

     '計算
     For i = 1 To Application.Round(終了時間 / 0.1, 0)
         時間 = i * 0.1

         垂直位置 = 垂直等速度 * 時間 - 1 / 2 * 重力加速度 * 時間 ^ 2
         水平位置 = 水平等速度 * 時間

         Cells(6 + 回数, 1).Value = 時間
         Cells(6 + 回数, 2).Value = 垂直位置
         Cells(6 + 回数, 3).Value = 水平位置
         回数 = 回数 + 1

         If 垂直位置 < 0 Then
             Exit For
         End If
     Next i
 End Sub

(半平太) 2021/10/26(火) 09:46


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.