飽和曲線
package crtrj; import java.awt.*; import java.awt.event.*; import java.applet.*; public class Applet1 extends Applet { private boolean isStandalone = false; private TextField textField1 = new TextField(); private TextField textField2 = new TextField(); private Label label1 = new Label(); private Label label2 = new Label(); private Label label3 = new Label(); private TextField textField3 = new TextField(); private Button button1 = new Button(); //引数値の取得 public String getParameter(String key, String def) { return isStandalone ? System.getProperty(key, def) : (getParameter(key) != null ? getParameter(key) : def); } //アプレットのビルド public Applet1() { } //アプレットの初期化 public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } //コンポーネントの初期化 private void jbInit() throws Exception { textField1.setText("0.005"); textField1.setBounds(new Rectangle(41, 249, 49, 21)); this.setLayout(null); textField2.setText("100"); textField2.setBounds(new Rectangle(140, 251, 45, 19)); label1.setText("C"); label1.setBounds(new Rectangle(12, 250, 26, 21)); label2.setText("R"); label2.setBounds(new Rectangle(110, 253, 25, 17)); label3.setText("E"); label3.setBounds(new Rectangle(216, 249, 26, 21)); textField3.setText("1.5"); textField3.setBounds(new Rectangle(245, 248, 44, 23)); button1.setLabel("計算"); button1.setBounds(new Rectangle(310, 247, 69, 23)); button1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { button1_actionPerformed(e); } }); this.add(textField1, null); this.add(label1, null); this.add(label3, null); this.add(textField3, null); this.add(label2, null); this.add(button1, null); this.add(textField2, null); } //アプレットの情報取得 public String getAppletInfo() { return "アプレット情報"; } //引数情報の取得 public String[][] getParameterInfo() { return null; } public void paint(Graphics g){ double C,R,V,v,t; int px,py,osx=30,osy=220,i; int ox=osx,oy=osy; //パラメータを読み込む C=Double.parseDouble(textField1.getText()); R=Double.parseDouble(textField2.getText()); V=Double.parseDouble(textField3.getText()); //C=0.005; //R=100; //V=1.5; //x軸と目盛りを表示 g.drawLine(osx,oy,osx+300,oy); for(i=0;i<=300;i=i+1){ if(i % 20==0) g.drawLine(i+osx,oy,i+osx,oy-3); if(i % 100==0) { g.drawLine(i+osx,oy,i+osx,oy-7); g.drawString(Integer.toString(i/100),i+osx-3,oy+12); } } //y軸と目盛りを表示 g.drawLine(osx,oy,osx,oy-200); for(i=0;i<=200;i=i+1){ if(i % 20==0) g.drawLine(osx,oy-i,osx+3,oy-i); if(i % 100==0) { g.drawLine(osx,oy-i,osx+7,oy-i); g.drawString(Integer.toString(i/100),osx-12,oy-i+3); } } //式の表示 //理論式の表示 for(t=0.0;t<3.0;t=t+0.05){ v=V*(1.0-Math.pow(Math.E,-t/(R*C))); px=(int)(t*100)+osx; py=osy-(int)(v*100); g.drawLine(ox,oy,px,py); ox=px;oy=py; //System.out.println("t:"+t+" v:"+v); } //数値計算での表示 Euler( g,C,R,V); } void Euler(Graphics g,double C,double R,double V){ //数値解析をする int px,py,osx=30,osy=220; int ox=osx,oy=220; double t; g.setColor(new Color(100,100,255)); double vc=0.0,dt=0.01; ox=osx;oy=200; for(t=0.0;t<3.0;t=t+dt){ //dt後の値を求める vc = vc + (1/(C*R))*(V-vc)*dt; //表示 px=(int)(t*100)+osx; py=osy-(int)(vc*100); g.drawLine(ox,oy,px,py); ox=px;oy=py; //System.out.println("t:"+t+" v:"+vc); } } void button1_actionPerformed(ActionEvent e) { repaint(); } }