⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 goldsearch.java

📁 用黄金分割搜索算法求cos(x),x∈[-π/2,π/2]的最大值
💻 JAVA
字号:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GoldSearch extends JFrame implements ActionListener
{
	private JTextArea display = new JTextArea (5,5);
	private JButton search = new JButton("黄金搜索STAR!");
	private Picture p = new Picture();         //画板
	public GoldSearch ()    //初始化过程
	{
		Dimension size =this.getSize();
		p.setBackground(Color.gray);
		p.setSize(30,20);
		p.setVisible(true);
		JPanel control = new JPanel();
		control.setBackground(Color.darkGray);
		control.setSize(200,200);
		control.setVisible(true);
		control.add(display);
		control.add(search);
		search.addActionListener(this);
		getContentPane().add(p,"Center");
		getContentPane().add(control,"South");
		display.append("单击按钮可动态演示黄金搜索全过程,并得出图形的最大值");
		display.setEditable(false);
		//display.setLineWrap(true);
        setTitle("数值算法:黄金分割搜索(张轶雯 软件0402 040950211)");        
	}
	public void actionPerformed(ActionEvent e)     //黄金算法的实现过程
	{
		int HREF=300,VREF=200;    //设置坐标系
		double a= -Math.PI/2, b=Math.PI/2 ,d=0.001 ,x1 ,x2 ,f1 ,f2 ,Xmax=(a+b)/2,Ymax=Math.cos(Xmax);
		int MaxX = (int)(Xmax*100),MaxY = (int)(Ymax*100);
        x1 = a+ 0.382*(b-a);
		x2 = a+ 0.618*(b-a);
		f1 = Math.cos(x1);
		f2 = Math.cos(x2);

		Graphics g=p.getGraphics(); //创建画笔
		g.setColor(Color.yellow);
		Dimension size =this.getSize();
        while (b-a > d)          //黄金搜索的核心算法
        {
			if (f2>f1){
				a = x1;
				x1= x2;
				f1= f2;
				x2= a +0.618*(b-a);
				f2= Math.cos(x2);
			}
			else {
				b = x2;
				x2= x1;
				f2= f2;
				x1= a +0.382*(b-a);
				f1= Math.cos(x1);
			}
			Xmax = (a+b)/2;
			Ymax = Math.cos(Xmax);
			MaxX = (int)(Xmax*100);
		    MaxY = (int)(Ymax*100);
			for(int i=0;i<50000000;i++);     //延长时间
			g.drawLine(MaxX+HREF,-MaxY+VREF,MaxX+HREF,VREF);   //对搜过的x画线
			display.setText("用黄金分割求得图形的最大值为:"+'\n'+"x="+String.valueOf(Xmax)+'\n'+"y="+Ymax+'\n'+"原函数:"+'\n');
			System.out.println("x="+Xmax);
        }     
		display.append("当x="+String.valueOf((int)Xmax)+"时 ,y=cosx 有最大值"+" y="+String.valueOf((int)(Ymax+1)));
        g.setColor(Color.green);
		g.fillOval(MaxX+HREF ,-MaxY+VREF ,5,5); //对结果做标记
		g.drawString("("+String.valueOf(Xmax)+","+String.valueOf(Ymax)+")",MaxX+10+HREF,VREF-MaxY-10);
	}
	
	public static void main(String args[])
	{
		GoldSearch f = new GoldSearch();
        f.setBackground(Color.black);
		f.setSize(600,600);
		f.setVisible(true);
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
	}
	class Picture extends JPanel      
  {
  	private final int HREF = 300 , VREF = 200;
  
    public void paintComponent(Graphics g)      //画板的初始化
	{
	   Dimension size =this.getSize();
	   super.paintComponent(g);
	   g.setColor(Color.black);
	   g.drawString("用黄金分割法求cos(x),x∈[-π/2,π/2]的最大值",5,15);
	   g.setColor(Color.white);
	   g.drawLine(HREF-250,VREF,HREF+250,VREF);
	   g.drawLine(HREF,VREF-160,HREF,VREF+160);
	   g.drawLine(HREF+245,VREF-5,HREF+250,VREF);
	   g.drawLine(HREF+245,VREF+5,HREF+250,VREF);
	   g.drawLine(HREF-5,VREF-155,HREF,VREF-160);
	   g.drawLine(HREF+5,VREF-155,HREF,VREF-160);
	   g.drawString("0",HREF,VREF);
	   g.drawString("x",HREF+255,VREF);
	   g.drawString("y=cosx",HREF,VREF-165);       //画坐标

	   int rate = 100,HBound,VBound;
	   double hBound,vBound;
       double a= -Math.PI/2,b=Math.PI/2;
	   int m = (int)(rate * a),n = (int)(rate*b);
	   g.drawString("-π/2",m+HREF,VREF+15);
	   g.drawString("π/2",n+HREF,VREF+15);
       
	   g.setColor(Color.red);
	   for(HBound=m; HBound<=n;HBound++)
		{
		   hBound = (double)HBound/rate;                    // WRONG : hBound = (double)(HBound/rate);
		   vBound = Math.cos(hBound);
		   VBound = (int)(vBound*rate);
		   g.drawLine(HBound+HREF,-VBound+VREF,HBound+HREF,-VBound+VREF);          // -VBound

		}        //画函数y=cosx
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -