飽和曲線


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();
}
}
