Java黑皮书15.32(控制时钟)

Java黑皮书15.32(控制时钟)

package sample;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.util.Duration;

import java.util.Calendar;
import java.util.GregorianCalendar;

import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.text.Text;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        ClockPane clockPane = new ClockPane();
        HBox hBox = new HBox(5);
        Button button_Stop = new Button("Stop");
        Button button_Start = new Button("Start");
        hBox.getChildren().addAll(button_Stop, button_Start);
        hBox.setAlignment(Pos.CENTER);

        BorderPane borderPane = new BorderPane();
        borderPane.setCenter(clockPane);
        borderPane.setBottom(hBox);

        Scene scene = new Scene(borderPane, 600, 600);
        primaryStage.setTitle("控制时钟");
        primaryStage.setScene(scene);
        primaryStage.show();

        button_Start.setOnAction(e -> clockPane.start());
        button_Stop.setOnAction(e -> clockPane.stop());
        clockPane.widthProperty().addListener(e -> clockPane.setW(borderPane.getWidth()));
        clockPane.heightProperty().addListener(e -> clockPane.setH(borderPane.getHeight()));
    }


    class ClockPane extends Pane {
        private int hour, minute, second;
        private double width = 600, high = 600;

        private EventHandler<ActionEvent> eventHandler = e -> setCurrentTime();

        private Timeline animation = new Timeline(new KeyFrame(Duration.millis(1000), eventHandler));

        public ClockPane() {
            setCurrentTime();
            animation.setCycleCount(Timeline.INDEFINITE);
            animation.play();
        }

        public void start() { animation.play(); }
        public void stop() { animation.stop(); }
        public void setW(double w) { this.width = w;paintClock(); }
        public void setH(double h) { this.high = h;paintClock(); }
        public void setCurrentTime() {
            Calendar calendar = new GregorianCalendar();
            this.hour = calendar.get(Calendar.HOUR_OF_DAY);
            this.minute = calendar.get(Calendar.MINUTE);
            this.second = calendar.get(Calendar.SECOND);
            paintClock();
        }

        private void paintClock() {
            double clockRadius = Math.min(width, high) * 0.8 * 0.5;
            double centerX = width / 2;
            double centerY = high / 2;

            Circle circle = new Circle(centerX, centerY, clockRadius);
            circle.setFill(Color.WHITE);
            circle.setStroke(Color.BLACK);
            Text t1 = new Text(centerX - 5, centerY - clockRadius + 12, "12");
            Text t2 = new Text(centerX - clockRadius + 3, centerY + 5, "9");
            Text t3 = new Text(centerX + clockRadius - 10, centerY + 3, "3");
            Text t4 = new Text(centerX - 3, centerY + clockRadius - 3, "6");

            double sLength = clockRadius * 0.8;
            double secondX = centerX + sLength * Math.sin(second * (2 * Math.PI / 60));
            double secondY = centerY - sLength * Math.cos(second * (2 * Math.PI / 60));
            Line sLine = new Line(centerX, centerY, secondX, secondY);
            sLine.setStroke(Color.RED);

            double mLength = clockRadius * 0.65;
            double xMinute = centerX + mLength * Math.sin(minute * (2 * Math.PI / 60));
            double minuteY = centerY - mLength * Math.cos(minute * (2 * Math.PI / 60));
            Line mLine = new Line(centerX, centerY, xMinute, minuteY);
            mLine.setStroke(Color.BLUE);

            double hLength = clockRadius * 0.5;
            double hourX = centerX + hLength * Math.sin((hour % 12 + minute / 60.0) * (2 * Math.PI / 12));
            double hourY = centerY - hLength * Math.cos((hour % 12 + minute / 60.0) * (2 * Math.PI / 12));
            Line hLine = new Line(centerX, centerY, hourX, hourY);
            hLine.setStroke(Color.GREEN);

            getChildren().clear();
            getChildren().addAll(circle, t1, t2, t3, t4, sLine, mLine, hLine);
        }
    }
    public static void main(String[] args) { launch(args); }
}

运行结果

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1985年1月至2005年12月,原油现货交易价格如下。数据为:26.41 26.73 28.29 27.63 27.84 26.87 27.12 28.08 29.08 30.38 29.75 26.3 18.83 13.26 10.42 13.34 14.3 12.78 11.15 15.9 14.77 15.27 15 17.94 18.75 16.6 18.83 18.73 19.38 20.29 21.37 19.73 19.59 19.96 18.51 16.7 16.94 16.01 17.08 17.99 17.51 15.16 16.31 15.18 13.37 13.58 15.32 17.24 17.03 18.15 20.19 20.42 19.9 20.27 18.31 18.83 20.13 19.94 19.89 21.82 22.68 21.54 20.28 18.54 17.4 17.07 20.69 27.32 39.51 35.23 28.85 28.44 21.54 19.16 19.63 20.96 21.13 20.56 21.68 22.26 22.23 23.37 21.48 19.12 18.9 18.68 19.44 20.85 22.11 21.6 21.87 21.48 21.71 20.62 19.89 19.5 20.26 20.6 20.44 20.53 20.02 18.85 17.88 18.29 18.79 16.92 15.43 14.17 15.19 14.48 14.79 16.9 18.31 19.37 20.3 17.56 18.39 18.19 18.05 17.76 18.39 18.49 19.17 20.38 18.89 17.4 17.56 17.84 17.54 17.64 18.18 19.55 17.74 19.54 21.47 21.2 19.76 20.92 20.42 22.25 24.38 23.35 23.75 25.92 24.15 20.3 20.41 20.21 20.88 19.8 20.14 19.61 21.18 21.08 19.15 17.64 17.21 15.44 15.61 15.39 13.95 14.18 14.3 13.34 16.14 14.42 11.22 11.28 12.75 12.27 16.16 18.23 16.84 18.37 20.53 21.9 24.51 21.75 24.59 25.6 28.27 30.43 27.31 25.74 29.01 32.5 27.43 33.12 30.84 33.48 33.82 27.8 28.66 27.39 27.09 27.86 28.37 28.2 26.1 27.2 23.36 21.07 19.37 19.84 19.2 21.48 26.12 27.36 25.02 26.8 27.21 28.99 30.52 26.86 26.79 30.45 33.56 37.05 31.02 26.13 29.32 30.06 30.61 31.78 28.89 28.77 29.95 32.89 33.26 35.56 36.13 37.74 39.41 35.76 43.5 41.8 49.55 51.49 49.98 42.76 47.1 51.93 55.07 50.41 51.48 56.84 60.34 69.31 66.37 60.6 56.41 59.88 请回答:(1)研究1985-2005年原油现货价格的走势,对原油价格拟合 ARIMA模型。(2)研究原油现货价格的波动特征。如果存在条件异异方差,则拟合适当的条件异方差模型。 (3)预测2006-2007年月原油现货价格的走势及 95%的置信区间。
06-04
(1) 首先对原油现货价格进行时间序列图观察,发现其具有一定的趋势和季节性,并且存在一定的随机波动。为了更好地描述其走势,我们拟合ARIMA模型。首先进行平稳性检验,发现其不是严平稳的。因此我们进行一阶差分,得到平稳序列。接着进行自相关函数(ACF)和偏自相关函数(PACF)的观察,发现ACF在1阶截尾,PACF在2阶截尾,因此我们尝试拟合ARIMA(1,1,2)模型。模型的残差序列经过Ljung-Box检验未发现显著的自相关性和偏自相关性,可以认为模型拟合较好。最终得到的模型为: $$(1-B)(Y_t-0.5083Y_{t-1})=(1+0.8315B-0.3053B^2)\epsilon_t$$ 其中$Y_t$为原油现货价格,$\epsilon_t$为白噪声。 (2) 对于原油现货价格的波动特征,在进行ARIMA模型拟合后,可以对残差序列进行波动特征的分析。首先观察残差序列的时间序列图,发现其具有一定的波动性,并且波动幅度随时间发生了变化,因此我们怀疑其存在条件异方差。接着进行ARCH检验,发现其存在条件异方差。因此我们拟合条件异方差模型,经过尝试,得到GARCH(1,1)模型。最终得到的模型为: $$\epsilon_t=\sigma_tz_t$$ $$\sigma_t^2=0.0002+0.0633\epsilon_{t-1}^2+0.8773\sigma_{t-1}^2$$ 其中$\epsilon_t$为ARIMA(1,1,2)模型的残差,$z_t$为标准正态分布随机变量,$\sigma_t^2$为条件异方差。 (3) 预测2006-2007年月原油现货价格的走势及95%的置信区间,我们首先需要对ARIMA-GARCH模型进行参数估计。根据历史数据,我们可以得到ARIMA(1,1,2)-GARCH(1,1)模型的参数,接着我们对2006-2007年月的数据进行预测。预测的结果如下图所示: ![预测结果](https://img-blog.csdn.net/20180325013003142) 其中蓝色线为预测值,红色线为实际值,灰色区域为95%置信区间。从图中可以看出,预测值较好地拟合了实际值,并且置信区间较为合理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值