区分求積法によるパイの計算
上のラベルは計算値、下のラベルは誤差。
テキストフィールドに数値を入れてみてください。2から1づつ増加させるとよく解かると思います。10000以上にはなりません。
/*
A basic extension of the java.applet.Applet class
*/
import java.awt.*;
import java.applet.*;
public class Applet1 extends Applet
{
double x,h,a,b,dy;
double n=10,n1;
public void init()
{
// Take out this line if you
don't use symantec.itools.net.RelativeURL or
symantec.itools.awt.util.StatusScroller
symantec.itools.lang.Context.setApplet(this);
// This code is automatically
generated by Visual Cafe when you add
// components to the visual
environment. It instantiates and initializes
// the components. To modify
the code, only use code syntax that matches
// what Visual Cafe can
generate, or Visual Cafe may be unable to back
// parse your Java file into
its visual environment.
//{{INIT_CONTROLS
setLayout(null);
setSize(420,284);
textField1.setText("10");
add(textField1);
textField1.setBounds(276,216,134,24);
label1.setText(" 計算値");
add(label1);
label1.setBackground(java.awt.Color.green);
label1.setBounds(276,144,132,28);
label2.setText(" 誤差");
add(label2);
label2.setBackground(java.awt.Color.green);
label2.setBounds(276,180,132,24);
//}}
//{{REGISTER_LISTENERS
SymText lSymText = new
SymText();
textField1.addTextListener(lSymText);
//}}
}
//{{DECLARE_CONTROLS
java.awt.TextField textField1 = new
java.awt.TextField();
java.awt.Label label1 = new java.awt.Label();
java.awt.Label label2 = new java.awt.Label();
//}}
public void paint(Graphics g)
{
g.drawArc(-150,50,400,400,0,90);
g.drawLine(50,40,50,260);//x、y軸の描画
g.drawLine(40,250,260,250);
g.setColor(Color.blue);
if(n>201)//n>200になると描画できなくなるため
{
n1=200;
}
if(n<=200)
{
n1=n;
}
for (double j=0;j<n-1;j++)
{
double xn,yn,xm,ym;
xn=200/n1*j;
yn=Math.sqrt(40000-xn*xn);
xm=200/n1*(j+1);
ym=Math.sqrt(40000-xm*xm);
g.drawLine(50+(int)xn,250-(int)ym,50+(int)xn+(int)(200/n1),250-(int)ym);
//横の線を描画
g.drawLine(50+(int)xm,250-(int)ym,50+(int)xm,250);
//横の線を描画
}
double y=0,dy=0;
for(double k=1;k<n;k++)
//このfor
文(6行)が区分求積法の心臓部です。後のコードはユーザーインターフェイスのためのコードです。
{
dy=(Math.sqrt(1-(k/n)*(k/n)))*(1/n);//円の式
y=y+dy;
}
label1.setText(""+4*y);
double err=Math.abs((Math.PI-4*y)/Math.PI)*100;
label2.setText(""+err+"%");
}
class SymText implements java.awt.event.TextListener
{
public void
textValueChanged(java.awt.event.TextEvent event)
{
Object object = event.getSource();
if
(object == textField1)
textField1_TextValueChanged(event);
}
}
void
textField1_TextValueChanged(java.awt.event.TextEvent event)
{
// to do: code goes here.
String str=textField1.getText();
n= new
Double(str).doubleValue();//textFieldから数値を読み取る
if(n>10000)
{
n=10000;
}
repaint();
Graphics g=getGraphics();
g.drawString(""+n,
20, 20);
}
}