2012年の5月から作り始めたサーキットシミュレーションですが、少しずつ改善をしてバージョンアップをしてきたのですが、最近外にでかける元気がないので、家にこもって具合の悪いところをまとめて直しました。
直したところはたくさんあるのですが、今回もっとも力を入れたのは計算時間の短縮です。
僕のデスクトップで計算すると、CPUのパワーがあるので、鈴鹿サーキットのように計算回数の多いコースでも約30秒で計算できるのですが、ノートパソコンで計算すると3分20秒もかかってしまいました。
そもそも、このサーキットシミュレーションはサーキットで使うには現場向きではないのですが、1つの計算に3分もかかっていては全く使えません。
家で使う場合も1回の計算が10秒以内で終わらないとややイラっとするので、大幅に時間短縮をしたくなりました。
僕はコンピュータのプログラムに関しては、ほとんど素人なので、いまいちわかっていないのですが、シミュレーションの計算途中を見ていると、計算と表示を交互に行うような場合に時間がかかっているように感じたので、計算を先に行ってからまとめて表示をすることにしました。
その結果、デスクトップでは3秒2、ノートパソコンでは24秒にまで計算時間の短縮できました。
どちらも約90%の時間短縮成功です!。
僕のブログを見て、エクセルでサーキットシミュレーションをしている人がどれだけいるのかわかりませんが、以前ブログに載せたプログラムと最新のものは変更点がたくさんあるので、改めて掲載することにしました。
今回のものは、従来に対し以下の点が異なります。
1、ダウンフォースによる横Gの反映
2、コースの高低差による加速度の反映
3、計算時間短縮
あとは、路面のバンク角くらいかな?
'23.09.23:Excel 2021で計算したらやたらと時間がかかったので、合計時間の表示方法変更しました。
'24.02.08:気が付いたらまた計算が遅くなっていたので原因を探ったところ、計算結果を使って、表の中に追加した計算をするときに自動計算が働いて遅くなっていました。
自動計算をオフにしたところ、元に戻ったので、VBAの中に結果を表に表示するときだけ自動計算をオフにするプログラムを追加しました。
計算シート
計算結果
高低差を反映した結果、
従来よりも実測に合うようになりました。
走行距離の違いは
GPS座標から距離を算出する式を正しくした結果です。
マクロ
※行と列は計算シートに合わせてください。
Sub CircuitSim()
Dim P As Integer '計算区間数
Dim S As Integer '計算先頭行
Dim Q As Integer '計算行
Dim D As Integer 'コース分割数
Dim k As Integer '減速計算の繰り返し
Dim i As Integer '加速計算の繰り返し
Dim j As Integer '積算時間計算表示の繰り返し
Dim R As Single '曲率半径(m)
Dim H0 As Single '初期標高(m)
Dim H1 As Single '次区間標高(m)
Dim axmax As Single 'タイヤ摩擦円横G最大値
Dim aydmax As Single 'タイヤ摩擦円減速G最大値
Dim ayamax As Single 'タイヤ摩擦円加速G最大値
Dim axmaxv As Single 'ダウンフォース込みタイヤ摩擦円横G最大値
Dim aydmaxv As Single 'ダウンフォース込みタイヤ摩擦円減速G最大値
Dim ayamaxv As Single 'ダウンフォース込みタイヤ摩擦円加速G最大値
Dim ayemax As Single 'エンジン加速G最大
Dim kxg As Single '横G抵抗係数
Dim kzg As Single 'タイヤ摩擦円増加係数
Dim dX As Single '区間距離(m)
Dim dT As Single '区間時間(sec)
Dim V0 As Double '初期速度(m/sec)
Dim V1 As Double '次区間速度(m/sec)
Dim VM As Single '区間中間速度(m/sec)
Dim dV As Single '速度変化量(m/sec)
Dim UT As Single 'タイヤ使用率
Dim rV As Single '速度刻み幅(m/sec)
Dim ax As Single '横加速度(G)
Dim ay As Single '前後加速度(G)
Dim dVmax As Single '計算時最大速度
Dim time As Single '積算時間(sec)
axmax = Cells(2, 2) * 9.806 '単位換算
aydmax = Cells(3, 2) * 9.806 '単位換算
ayamax = Cells(4, 2) * 9.806 '単位換算
kxg = Cells(6, 2) '横G抵抗係数読み込み
kzg = Cells(4, 13) '揚力係数読み込み
P = Cells(9, 9) '区間数読み込み
S = 15 '加速計算開始行
Q = P + S '計算行の計算
D = Cells(8, 9) 'コース分割数の読み込み
Range(Cells(S, 2), Cells(Q, 13)).ClearContents '前回計算結果の消去
Cells(Q, 2) = Cells(Q, 1)
'減速側計算
For k = 0 To P - 1
dX = Cells(Q, 16) '区間距離読み込み
V0 = Cells(Q, 2) '初期速度(最低速度)読み込み
V1 = Cells(Q - 1, 1) '次区間の横G限界速度読み込み
dV = V0 - V1 '速度増加量の計算
R = Cells(Q - 1, 15) 'コーナ曲率半径読み込み
H0 = Cells(Q, 18) '初期標高読み込み
H1 = Cells(Q + 1, 18) '次区間標高読み込み
dH = H1 - H0 '区間高低差計算:正は上り
aH = 9.806 * dH / (dX ^ 2 + dH ^ 2) ^ 0.5 '高低差による加速度計算
If dV >= 0 Then '速度変化が正のとき:加速時
Cells(Q - 1, 2) = V1 '次区間速度V1をシートに入力
'速度変化が負のとき:減速時
Else
UT = 2 'タイヤ使用率を2とする
aydmaxv = aydmax * (1 + kzg * V1 ^ 2) + aH 'ダウンフォース込み減速加速度最大値計算
dVmax = (-V0 + (V0 ^ 2 + 2 * aydmaxv * dX) ^ 0.5) '最大減速可能量を計算
Do Until UT <= 1 'タイヤ使用率が1以下になるまで繰り返し
dV = V0 - V1 '速度変化量計算:正は加速
VM = (V0 + V1) / 2 '区間中間速度計算
dT = dX / VM '区間時間の計算
ay = dV / dT '減速加速度計算
ax = V1 ^ 2 / R '横加速度計計算
aydmaxv = aydmax * (1 + kzg * V1 ^ 2) + aH 'ダウンフォース込み減速加速度最大値計算
axmaxv = axmax * (1 + kzg * V1 ^ 2) 'ダウンフォース込み横加速度最大値計算
UT = ((ax / axmaxv) ^ 2 + (ay / aydmaxv) ^ 2) ^ 0.5 'タイヤ使用率計算
If dV >= 0 Then '速度変化量が正のとき(加速時)
UT = 1 'タイヤ使用率を1とする
End If
If Abs(dV) > dVmax Then '速度変化量が最大減速可能量よりも大きい場合
rV = Abs(dV) - dVmax '速度刻み幅計算
Else
rV = dVmax / 100 '速度刻み幅計算
End If
Cells(Q - 1, 2) = V1 'シートに次区間速度を入力:速度の確定
V1 = V1 - rV '次区間速度計算
Loop
Cells(Q, 3) = dV 'シートに速度変化量を入力:結果確認用
Cells(Q, 4) = dT 'シートに区間時間を入力:結果確認用
Cells(Q, 5) = ax 'シートに横加速度を入力:結果確認用
Cells(Q, 6) = ay 'シートに減速加速度を入力:結果確認用
UT = ((ax / axmaxv) ^ 2 + (ay / aydmaxv) ^ 2) ^ 0.5 'タイヤ使用率計算
Cells(Q, 7) = UT 'シートにタイヤ使用率を入力:結果確認用
End If
Q = Q - 1
Cells(9, 7) = Q
Next k
'加速側計算
Q = S '計算開始行
For i = 0 To P - 1
dX = Cells(Q + 1, 16) '区間距離読み込み
V0 = Cells(Q, 2) '初期横G限界速度読み込み
V1 = Cells(Q + 1, 2) '次区間速度計算
dV = V1 - V0 '速度変化量計算:正は加速
R = Cells(Q + 1, 15) 'コーナ曲率半径読み込み
H0 = Cells(Q, 18) '初期標高読み込み
H1 = Cells(Q + 1, 18) '次区間標高読み込み
dH = H1 - H0 '区間高低差計算:正は上り
aH = 9.806 * dH / (dX ^ 2 + dH ^ 2) ^ 0.5 '高低差による加速度計算
If dV <= 0 Then '速度変化量が負のとき(減速時)
Cells(Q + 1, 2) = V1 '次区間速度をV1とする
Else '速度変化量が正のとき(加速時)
Cells(Q, 3) = dV 'シートに速度変化量を入力:結果確認用
VM = (V0 + V1) / 2 '区間中間速度計算
dT = dX / VM '区間時間計算
ay = dV / dT '加速度計算
ayemax = Application.WorksheetFunction.Lookup(V0, Worksheets("Power").Range("I36:I3336"), Worksheets("Power").Range("H36:H3336"))
'エンジン加速度をpowerシートから参照
Cells(Q, 8) = ayemax 'シートにエンジン加速度を入力
If ay > ayemax - aH Then '加速度がエンジン加速度よりも大きい場合
ax = V0 ^ 2 / R '横加速度計算
ay = ayemax - aH - Abs(ax) * kxg '加速度の計算:エンジン加速度からタイヤ抵抗を減算
dT = (-V0 + (V0 ^ 2 + 2 * ay * dX) ^ 0.5) / ay '区間時間計算
End If
'加速度がエンジン加速度よりも小さい場合
dVmax = ay * dT '最大速度変化量計算
V1 = V0 + dVmax '次区間最大速度計算
Cells(Q + 1, 2) = V1 '次区間速度をシートに入力
UT = 2 'タイヤ使用率を2とする
Do Until UT <= 1 'タイヤ使用率が1以下になるまで繰り返し
dV = V1 - V0 '速度変化量計算
VM = (V0 + V1) / 2 '区間中間速度計算
dT = dX / VM '区間時間計算
ay = dV / dT '加速度計算
ax = V1 ^ 2 / R '横加速度計算
ayamaxv = ayamax * (1 + kzg * V1 ^ 2) 'ダウンフォース込み減速加速度最大値計算
axmaxv = axmax * (1 + kzg * V1 ^ 2) 'ダウンフォース込み横加速度最大値計算
UT = ((ax / axmaxv) ^ 2 + (ay / ayamaxv) ^ 2) ^ 0.5 'タイヤ使用率計算
If dV <= 0 Then '速度変化量が負のとき(減速時)
UT = 1 'タイヤ使用率を1にする
End If
'速度変化量が正のとき(加速時)
V1 = V1 - dVmax / 100 '次区間速度計算
Cells(Q + 1, 2) = V1 '次区間速度をシートに入力
Loop
Application.Calculation = xlCalculationManual '手動計算
'結果表示
Cells(Q, 3) = dV 'シートに速度変化量を入力
Cells(Q, 4) = dT 'シートに区間時間を入力
Cells(Q, 5) = ax 'シートに横加速度を入力
Cells(Q, 6) = ay 'シートに加速度を入力
UT = ((ax / axmaxv) ^ 2 + (ay / ayamaxv) ^ 2) ^ 0.5 'タイヤ使用率計算
Cells(Q, 7) = UT 'シートにタイヤ使用率を入力
End If
Q = Q + 1
Cells(8, 7) = Q
Next i
'結果計算 1コーナ最低速度まで
Q = S '計算開始行
For j = 0 To P - D
If Cells(Q, 2) > Cells(Q + D, 2) Then '減速時速度が低いとき
Cells(Q, 9) = Cells(Q + D, 2) * 3.6 'シートに速度を入力
Cells(Q, 11) = Cells(Q + D, 5) 'シートに横加速度を入力
Cells(Q, 12) = Cells(Q + D, 6) 'シートに前後加速度を入力
Cells(Q, 13) = Cells(Q + D, 7) 'シートにタイヤ使用率を入力
Else:
Cells(Q, 9) = Cells(Q, 2) * 3.6 'シートに速度を入力
Cells(Q, 11) = Cells(Q, 5) 'シートに横加速度を入力
Cells(Q, 12) = Cells(Q, 6) 'シートに前途加速度を入力
Cells(Q, 13) = Cells(Q, 7) 'シートにタイヤ使用率を入力
End If
Q = Q + 1
Next j
'結果計算 1コーナ最低速度からゴールまで
Q = P - D + S '計算開始行
For j = 0 To D
Cells(Q, 9) = Cells(Q, 2) * 3.6 'シートに速度を入力
Cells(Q, 11) = Cells(Q, 5) 'シートに横加速度を入力
Cells(Q, 12) = Cells(Q, 6) 'シートに前途加速度を入力
Cells(Q, 13) = Cells(Q, 7) 'シートにタイヤ使用率を入力
Q = Q + 1
Next j
'結果表示 合計時間
P = Cells(9, 9) '区間数読み込み
Q = S '計算開始行
Cells(Q, 10) = 0
For j = 0 To P - 1
Q = Q + 1
Cells(Q, 10) = Cells(Q - 1, 10) + Cells(Q, 16) / Cells(Q, 9) * 3.6 'シートに積算時間を入力
Next j
Application.Calculation = xlCalculationAutomatic '自動計算
End Sub