📄 goldsearch.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 + -