*振り子式車両傾斜角度計算 [#m3e211c9] 振り子式車両の傾斜角度を計算するプログラムをJavaServer Facesで作成する。~ ~ まず、傾斜角度を計算するManagedBeanを作成する。~ 軌間:gauge、カント:cant、カーブ半径:radius、速度:velocity、角度:tiltの各変数(getter/setterも)と角度を計算するメソッドcalculateTilt()を作成する。~ 入力が楽になるように、初期値に軌間1,067mm(狭軌)、カント105mm、カーブ半径400m、速度100km/hを設定しておく。~ 初期状態での傾斜角度を計算するため、@PostConstructを付けたメソッドをinit()作成し、calculateTilt()を呼び出しておく。~ 初期状態での傾斜角度を計算するため、@PostConstructを付けたメソッドinit()を作成し、calculateTilt()を呼び出しておく。~ 重力加速度は9.8m/s^2としている。~ > import javax.annotation.PostConstruct; import javax.inject.Named; import javax.enterprise.context.RequestScoped; @Named(value = "furico") @RequestScoped public class Furico { private double gauge = 1067; private double cant = 105; private double radius = 400; private double velocity = 100; private double tilt; private static final double GRAVITATIONAL_ACCELERATION = 9.8; public Furico() { } @PostConstruct private void init() { calculateTilt(); } // getter/setter省略 public void calculateTilt() { double v = velocity / 3.6; double a = v * v / radius; double t = Math.atan2(a, GRAVITATIONAL_ACCELERATION) - Math.atan2(cant, gauge); tilt = Math.max(Math.toDegrees(t), 0); } } calculateTilt()では傾斜角度の計算を行う。~ まず、速度を3.6で割って単位をkm/hからm/sに変換する。~ 次に、遠心力による加速度を速度^2/半径の式で計算する。(詳しくは「等速円運動」で検索)~ 最後に傾斜角度(tanα=a/g)を計算する。ただし、カントで傾斜(tanβ=cant/guage)がついているのでそれを差し引く。~ (Mathクラスの三角関数の角度は度数法(度)ではなく弧度法(ラジアン)なので変換する必要がある)~ また、カーブを低速で走った場合は角度が負の数になってしまうので0に置き換える。~ ~ 続いて、次のような画面をFaceletsで作成する。~ #ref(fu1.gif)~ まず、軌間、カント、カーブ半径、速度の入力項目と傾斜角度の出力項目を作成し、ManagedBeanの各変数に対応させる。~ 次に、計算ボタンを作成し、calculateTilt()を呼び出すように設定する。~ ここではf:ajaxタグを使用し、ボタンが押されたときにこのフォーム全体を送信し傾斜角度だけを書き換えるようにしている。~ > <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core"> <h:head> <title>振り子式車両傾斜角度計算</title> </h:head> <h:body> 振り子式車両傾斜角度計算<br/> <h:form> <h:outputLabel value="軌間(mm)"> <h:inputText value="#{furico.gauge}"/> </h:outputLabel> <br/> <h:outputLabel value="カント(mm)"> <h:inputText value="#{furico.cant}"/> </h:outputLabel> <br/> <h:outputLabel value="カーブ半径(m)"> <h:inputText value="#{furico.radius}"/> </h:outputLabel> <br/> <h:outputLabel value="速度(km/h)"> <h:inputText value="#{furico.velocity}"/> </h:outputLabel> <br/> <h:commandButton value="計算" action="#{furico.calculateTilt()}"> <f:ajax execute="@form" render="tilt"/> </h:commandButton> <br/> <h:outputLabel value="傾斜角度"> <h:outputText id="tilt" value="#{furico.tilt}"/> </h:outputLabel> </h:form> </h:body> </html> (注意)~ ばねの変形等による傾斜は無視している。~ また、傾斜の最大角度は車両によって異なる。~ -JR四国2000系気動車:5度~ -JR北海道キハ283系気動車:6度~ ~ *コメント [#e0d50fd3] #comment