区分求積法によるパイの計算 

上のラベルは計算値、下のラベルは誤差。

テキストフィールドに数値を入れてみてください。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);
           
    }
}

BACK >>