# solver_test.rb.txt: ruby script (encoding: Windows-31J) # 放物線の分析: ボールをなるべく遠くまで投げるための角度、最高位置を求める # ExcelのSolverを利用。 require "exlap" filename = "solver_test.xls" Exlap.new(filename) do |wb| slv = ExlSolver.new(wb.app.obj) ss = wb.fes # 空のワークシートを選択 ss.Activate vel = "C1" # 初速度が書かれているセル番地 g = 9.8 # 重力加速度 9.8メートル毎秒毎秒 ss.Range("A1:D1").Value = [["放物線の分析", "(初速度", 28, "m/s)"]] ss.Range("B2:E2").Value = [%w(初期の角度(度) 経過時間(秒)) + %w(横の距離x(b) 高さy(b))] # 見出し ss.Range("A3:A4").Value = [["x(距離)最大の時点"], ["↑y(高さ)最大の時点"]] # 縦の見出し for rn in 3..4 # rnは行番号 a = "B#{rn}" # 角度の番地 t = "C#{rn}" # 時間の番地 x = "D#{rn}" # 横の距離xの番地 y = "E#{rn}" # 高さyの番地 ss.Range(a).Value = (rn==3) ? 10 : "=R[-1]C" ss.Range(t).Value = 0.1 # 時間・秒数の初期値(ダミー) ss.Range(x).Formula = "=(#{vel}*COS(RADIANS(#{a})))*#{t}" ss.Range(y).Formula = "=(#{vel}*SIN(RADIANS(#{a})))*#{t}-#{g}*#{t}^2/2" slv.reset # 念のためソルバー諸設定のリセット case rn when 3 # xの最大値を求める slv.ok(x, 'max', nil, "#{a}:#{t}") slv.add(a, '>=', 10) slv.add(t, '>=', 0.1) slv.add(y, '>=', 0.0) when 4 # xが最大値の時のyの最大値を求める slv.ok(y, 'max', nil, t) slv.add(t, '>=', 0.1) end slv.settle end ss.range_autofit wb.save end