Основы высокоуровневого программированич

Разработка программы графического интегрирования методом Эйлера. Ознакомление с текстом программы. Рассмотрение руководства пользователя. Изучение методов приобретения навыков работы с графическим интерфейсом. Анализ причин некорректного ввод данных.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 27.09.2017
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Федеральное агентство по образованию Российской Федерации

ГОУ ВПО «УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Кафедра автоматизированных систем управления

Курсовая работа по дисциплине: «Высокоуровневое программирование»

Содержание

  • Задание на курсовую работу
  • 1. Постановка задачи
  • 2. Математическая модель решения задачи
  • 3. Схема решения задачи
  • 4. Исходный текст программы
  • 5. Руководство пользователя
  • 6. Результаты работы для различных вариантов
  • 7. Тестовые примеры
    • 7.1 Некорректный ввод данных
    • 7.2 Недостаточно данных
    • 7.3 Выход за границы значений
    • 7.4 Ограниченное количество ввода данных
  • Выводы
  • Список использованной литературы

Задание на курсовую работу

Разработать программу графического интегрирования методом Эйлера. Для заданной системы уравнения вида y'=F(x,y1,y2) и начальных условий у1(0) и у2(0) построить кусочно-линейный график решения у'=F(x,y1,y2), вычисляя у с заданным постоянным шагом по х:

F(x,y1,y2)=

y1(0)=0,y2

y2(0) и а задается с клавиатуры.

Изображение должно занимать большую часть экрана, сопровождаться заголовком, содержать наименования и градации осей и масштабироваться в зависимости от исходных данных. При любых допустимых значениях исходных данных изображение должно помещаться на экране. Программа не должна опираться на конкретные значения разрешения экрана.

Предусмотреть переключение между графическим и текстовым окнами для ввода исходной информации и вывода результатов интегрирования и графической интерпретации. программа эйлер интерфейс

Предусмотреть проверку корректности данных.

Для сдачи курсовой работы необходимо представить преподавателю исходный и исполнимый файлы на Java и пояснительную записку к курсовой работе.

1. Постановка задачи

Задача вычисления интегралов возникает во многих областях прикладной математики.

В большинстве случаев встречаются определённые интегралы от функций, первообразные которых не выражаются через элементарные функции. Кроме того, вприложениях приходится иметь дело с определёнными интегралами,сами подынтегральные функции не являются элементарными.

Распространеннымиявляются также случаи, когда подынтегральная функция задается графиком илитаблицей экспериментально полученных значений. В таких ситуациях используютразличные методы численного интегрирования, которые основаны на том, чтоинтеграл представляется в виде предела интегральной суммы (суммы площадей), ипозволяют определить эту сумму с приемлемой точностью. Пусть требуется вычислить интеграл

(1)

при условии, что a и b конечны и f(x) является непрерывной функцией на всем интервале (a, b). Значение интеграла S представляет собой площадь, ограниченную кривой f(x),осью x и прямыми x=a, x=b. Вычисление S проводится путемразбиения интервала от a до b на множество меньших интервалов,приближенным нахождением площади каждой полоски, получающейся при такомразбиении, и дальнейшем суммировании площадей этих полосок.

2. Математическая модель решения задачи

Исторически первым и наиболее простым способом численного решения задачи Коши для ОДУ первого порядка является метод Эйлера. В его основе лежит аппроксимация производной отношением конечных приращений зависимой (y) и независимой (x) переменных между узлами равномерной сетки:

,

где yi+1 это искомое значение функции в точке xi+1.

Если теперь преобразовать это уравнение, и учесть равномерность сетки интегрирования, то получится итерационная формула, по которой можно вычислить yi+1 , если известно yi в точке хi:

Сравнивая формулу Эйлера с общим выражением, полученным ранее, видно, что для приближенного вычисления интеграла в (6.3) в методе Эйлера используется простейшая формула интегрирования - формула прямоугольников по левому краю отрезка.

Графическая интерпретация метода Эйлера также не представляет затруднений (см. рисунок ниже). Действительно, исходя из вида решаемого уравнения следует, что значение есть значение производной функции y(x) в точке x=xi - , и, таким образом, равно тангенсу угла наклона каcательной, проведенной к графику функции y(x) в точке x=xi.

Рис.1 Иллюстрация метода Эйлера

Из прямоугольного треугольника на рисунке можно найти

,

откуда и получается формула Эйлера. Таким образом, суть метода Эйлера заключается в замене функции y(x) на отрезке интегрирования прямой линией, касательной к графику в точке x=xi. Если искомая функция сильно отличается от линейной на отрезке интегрирования, то погрешность вычисления будет значительной. Ошибка метода Эйлера прямо пропорциональна шагу интегрирования:

Ошибка ~ h

Процесс вычислений строится следующим образом. При заданных начальных условиях x0 и y0 можно вычислить

Таким образом, строится таблица значений функции y(x) с определенным шагом (h) по x на отрезке [x0, xN]. Ошибка в определении значения y(xi) при этом будет тем меньше, чем меньше выбрана длина шага h (что определяется точностью формулы интегрирования).

При больших h метод Эйлера весьма неточен. Он дает все более точное приближение при уменьшении шага интегрирования. Если отрезок [xi, xi+1] слишком велик, то каждый участок [xi, xi+1] разбивается на N отрезков интегрирования и к каждому их них применяется формула Эйлера с шагом , то есть шаг интегрирования h берется меньше шага сетки, на которой определяется решение.

3. Схема решения задачи

Рис. 2. Схема решения задачи

Рис. 3. Схема решения задачи

Рис.4. Схема решения задачи

4. Исходный текст программы

package main;

import dataSet.MethodDataSet;//класс, который будет обрабатывать данные

import graph.Graph;//класс, который будет обрабатывать рисовать график

import java.awt.BorderLayout; //менеджеры раскладки

import java.awt.Dimension;//класс инкапсулирует ширину и высоту компонента

import java.awt.Font; //класс представляет шрифты

import java.awt.GridBagConstraints; //класс определяет ограничения для компонентов, которые размечаются

//GridBagLayout класс является гибким менеджером по расположению, который выравнивает компоненты вертикально,

import java.awt.GridBagLayout;// горизонтально или вдоль их базовой линии, не требуя что компоненты иметь тот же самый размер.

import java.awt.Insets;//Insets объект является представлением границ контейнера.

import java.awt.event.ActionEvent; //Интерфейс для событий, которые знают, как диспетчеризировать себя.

import java.awt.event.ActionListener;//Интерфейс слушателя для того, чтобы получить события действия.

import java.math.BigDecimal;//Неизменная, произвольная точность подписанные десятичные числа.

//Неизменные объекты, которые инкапсулируют настройки контекста, которые описывают определенные правила

import java.math.MathContext;//для числовых операторов, таких как реализованные BigDecimal класс.

import java.math.RoundingMode;//Определяет округляющееся поведение для числовых операций, способных к отбрасыванию точности.

import java.util.Timer;//Задача, которая может быть запланирована

import java.util.TimerTask;//для одноразового или повторного выполнения Таймером.

import javax.swing.JButton;//Реализация кнопки "нажатия".

import javax.swing.JFrame;//Расширенная версия java.awt.Frame это добавляет поддержку компонентной архитектуры JFC/Swing.

import javax.swing.JLabel;//Область дисплея для короткой текстовой строки или изображения, или обоих.

//JOptionPane облегчает раскрываться стандартное диалоговое окно, которое запрашивает пользователей значение или сообщает им о чем-то.

import javax.swing.JOptionPane;

import javax.swing.JPanel;//JPanel универсальный легкий контейнер.

import javax.swing.JTextField;//JTextField легкий компонент, который позволяет редактирование одной строки текста.

/**

* Фрейм для добавления, изменения данных, изменение цвета линии, цвета заливки.

*/

public class MainFrame extends JFrame {

// Конструктор

// (аргументы - координаты и размеры панели):

public MainFrame(int w, int h) {

//Режим запрета изменения размеров окна:

setPreferredSize(new Dimension(w, h));//задаемразмеры

//инициализируемклассданных

dataSet = newMethodDataSet();

// сконструировать главную панель

mainPanel = new JPanel();

mainPanel.setLayout(new BorderLayout());//расположениеокон

//Расставляем компоненты по местам

//панель Заголовка

header = new JPanel();

header.setLayout(null);//расположениеокон

header.setPreferredSize(new Dimension(w, 260));

createHeader(w, h);//помещаем в панель Заголовка текстовые компоненты, меню

// сконструировать Центральную панель

content = new JPanel();

content.setLayout(new GridBagLayout());//расположениеокон

createContent();//помещаем в Центральную панель текстовые компоненты для вводаданных

// сконструировать footer панель

footer = new JPanel();

footer.setLayout(new GridBagLayout());//расположениеокон

footer.setPreferredSize(new Dimension(w, 80));

createFooter();//помещаем в нижнюю панель кнопки

//добавляем панели в главную панель

mainPanel.add(header, BorderLayout.PAGE_START);//верхняяобластьпанели

mainPanel.add(content, BorderLayout.CENTER);//центральнаяобластьпанели

mainPanel.add(footer, BorderLayout.PAGE_END);//низпанели

getContentPane().add(mainPanel);

pack();//изменяет размеры окна, принимая во внимание предпочтительные размеры его компонентов

}

//Метод добавляет компоненты в панель Header

//метод получает размеры для расположения компонентов

private void createHeader(int w, int h) {

//компоненты панели Заголовка

integrals = new JLabel[6];//Массив текстовых меток для визуализации интеграла

//topLabel - текстовая метка Заголовка проекта

topLabel = new JLabel("<html><center>Введите данные для того, чтобы произвести графические интегрирование данной функции методом Эйлера <center></html>");

/*

*setBounds(int x,int y,int width,int height)

*Перемещения и изменяют размеры этого компонента. Новое расположение верхнего левого угла

*определяется x и y, и новый размер определяется width и height.

*x - новая x-координата этого компонента

*y - новая y-координата этого компонента

*width - новое width из этого компонента

*height - новое height из этого компонента

*/

topLabel.setBounds(w / 6, 20, 400, 40);

header.add(topLabel);

// Задаем текстовые метки:

integrals[0] = new JLabel("?");//созаем новую текст метку ?

integrals[0].setFont(new Font("Ariаl", Font.BOLD, 60));//устанавливаемшрифт

integrals[0].setBounds(w / 3 - 40, 90, 40, 64);//устанавливаемрасположение

header.add(integrals[0]);//добовляемкомпонентвпанель Header

integrals[1] = new JLabel("x1");//созаем новую текст метку х1

integrals[1].setBounds(w / 3 - 25, 66, 55, 40);//устанавливаем расположение

integrals[2] = new JLabel("x2");//созаем новую текст метку х2

integrals[2].setBounds(w / 3 - 40, 148, 55, 40);//устанавливаем расположение

integrals[3] = new JLabel("1.25");//созаем новую текст метку а*степень экспоненты

integrals[3].setBounds(w / 3 - 10, 115, 160, 24);//устанавливаем расположение

integrals[4] = new JLabel(" (1 - e )");//созаем новую текст метку

integrals[4].setBounds(w / 3 + 34, 115, 160, 24);//устанавливаем расположение

integrals[5] = new JLabel(" 0.8x");//созаем новую текст метку

integrals[5].setBounds(w / 3 + 80, 108, 140, 24);//устанавливаем расположение

integrals[5].setFont(new Font("Ariаl", Font.ITALIC, 10));//устанавливаем шрифт

header.add(integrals[5]);//добовляем компонент в панель Header

for (int i = 1; i < 5; i++) {

integrals[i].setFont(new Font("Ariаl", Font.ITALIC, 20));//устанавливаемшрифт

header.add(integrals[i]);//добовляемкомпонентывпанель Header

}

}

//метод для добавления компонентов в панель данных(content)

private void createContent() {

// Текстовое поле для ввода границы интервала:

//Массив меток:

inputLabel = new JLabel[6];

inputLabel[0] = new JLabel("Область определения х = 0 до х = ", JLabel.RIGHT);

inputLabel[1] = new JLabel("Параметр а = ", JLabel.RIGHT);

inputLabel[2] = new JLabel("Интегрируем от х1 = ", JLabel.RIGHT);

inputLabel[3] = new JLabel("дохn = ", JLabel.RIGHT);

inputLabel[4] = new JLabel("у2 = ", JLabel.RIGHT);

inputLabel[5] = new JLabel("Вычисленныйинтеграл = ", JLabel.RIGHT);

//Массивтекстовогополя:

inputText = newJTextField[10];

// Текстовое поле для ввода границы интервала:

inputText[0] = new JTextField("5", 12);//область определения х=0, до х=

inputText[1] = new JTextField("-3", 12);//параметра

inputText[2] = new JTextField("1", 12);//xStart

inputText[3] = new JTextField("3", 12);//xEnd

inputText[4] = new JTextField("2", 12);//у2

inputText[5] = new JTextField(12);//Вычисленныйинтеграл

inputText[5].setEditable(false);

//добавляем компоненты в панель Ввода данных(content)

for (int i = 0; i < 6; i++) {

content.add(inputLabel[i], new GBC(0, i).setAnchor(GBC.FIRST_LINE_END).setWeight(450, 35));

content.add(inputText[i], new GBC(1, i).setAnchor(GBC.FIRST_LINE_START).setWeight(250, 35));

}

}

//метод для добавления компонентов в нижнюю панель

private void createFooter() {

//Авторпроекта

authorLabel = new JLabel("Выполнил: СалиховИ.В.");

//Кнопка "Нарисовать"

paintButton = new JButton("Нарисовать");

paintButton.addActionListener(new ActionListener() {

// Методдляобработкищелчканакнопке:

public void actionPerformed(ActionEvent event) {

// Реакция на щелчок

updateLabel();

if (mark == true) {//если данные верные

// Сoзданиеокнаграфика:

Graph gr = new Graph(dataSet);

//устанавливаем Флажок

gr.setMark(true);

// Показатьокно

gr.setVisible(true);

mark = false;

}

}

});

//Кнопка "Очистить"

clearButton = new JButton("Очистить");

clearButton.addActionListener(new ActionListener() {

// Методдляобработкищелчканакнопке:

public void actionPerformed(ActionEvent event) {

// Реакция на щелчок

cleanLabel();

}

});

//Кнопка "Вычислитель"

mathButton = newJButton("Вычислить");

mathButton.addActionListener(newActionListener() {

// Метод для обработки щелчка на кнопке:

public void actionPerformed(ActionEvent event) {

// Реакция на щелчок

updateLabel();//обновляем значений интеграла

if (mark == true) {//если данные верные

dataSet.setSum();//получаем значение интеграла

inputText[5].setText(Double.toString(dataSet.getSum()));//обновляем текст поле и выводим значение

mark = false;

}

}

});

//Добовляем компоненты в панель footer

footer.add(authorLabel, new GBC(0, 0).setAnchor(GBC.LINE_START).setWeight(250, 30).setInsets(10));

footer.add(paintButton, new GBC(1, 0).setAnchor(GBC.LINE_END).setWeight(250, 30).setInsets(10));

footer.add(mathButton, new GBC(2, 0).setAnchor(GBC.LINE_END).setWeight(250, 30).setInsets(10));

footer.add(clearButton, new GBC(3, 0).setAnchor(GBC.LINE_START).setWeight(250, 30).setInsets(10));

}

//методочисткиТекстовыхметок

privatevoidcleanLabel() {

//Устанавливаем значение текст меток null

inputText[0].setText("");

inputText[1].setText("");

inputText[2].setText("");

inputText[3].setText("");

inputText[4].setText("");

inputText[5].setText("");

}

//Вводданныхиобновлениеметок

private void updateLabel() {

// Получаем введенные данные

String xEnd = inputText[0].getText();

String a = inputText[1].getText();

String startBy = inputText[2].getText();

String finishBy = inputText[3].getText();

String y2 = inputText[4].getText();

if (isUserAGoat < 5) {//если пользователь ввел не правильно 5раз данные, то на 5сек блокируется кнопка

try {

dataSet.setxEnd(parserToDouble(xEnd)).setFinishBy(parserToDouble(finishBy)).setStartBy(parserToDouble(startBy)).setY2(parserToDouble(y2)).setA(parserToDouble(a));

//если условие не выполняется выводиться ошибка

if (!(dataSet.getY2() > -50 && dataSet.getY2() < 50)) {

isUserAGoat++;

JOptionPane.showMessageDialog(null, "Областьопределениядолжнабытьбольшенуля\nКорректнымзначениедля y2 будетдиапозонзначенийт -50 до 50 \n осталосьпопыток: " + (5 - isUserAGoat), "Ошибка", JOptionPane.WARNING_MESSAGE);

return;

//a1>0&&a1<1000

} else if (dataSet.getA()==0) {

isUserAGoat++;

JOptionPane.showMessageDialog(null, "Введитеабольшеилименьше 0.\nКорректнымзначениедляабудетдиапозонзначенийот -100 до -1 \nосталосьпопыток:" + (5 - isUserAGoat), "Ошибка", JOptionPane.WARNING_MESSAGE);

return;

//if((xx >= h)&&(xx<1000)){}

}else if (!(dataSet.getA() > -100 && dataSet.getA() < 0)) {

isUserAGoat++;

JOptionPane.showMessageDialog(null, "Задайтекорректныйдиапазондопустимыхзначенийдляа.\nКорректнымзначениедляабудетдиапозонзначенийот -100 до -1 \nосталосьпопыток:" + (5 - isUserAGoat), "Ошибка", JOptionPane.WARNING_MESSAGE);

return;

//if((xx >= h)&&(xx<1000)){}

}

else if (!(dataSet.getxEnd() >= dataSet.getH() && dataSet.getxEnd() < 1000)) {

isUserAGoat++;

JOptionPane.showMessageDialog(null, "Задайтекорректныйдиапазондлях\nКорректнымзначениедля x будетдиапозонзначенийот 0 до 1000 \nосталосьпопыток:" + (5 - isUserAGoat), "Ошибка", JOptionPane.WARNING_MESSAGE);

return;

} /* Проверкаввода x1

//if((x0_ < 0)||(x0_>xx))

*/ else if (dataSet.getStartBy() < 0 || dataSet.getStartBy() > dataSet.getxEnd()) {

isUserAGoat++;

JOptionPane.showMessageDialog(null, "Интервал x1 долженбытьбольше,чем " + dataSet.getH() + " именьше " + dataSet.getFinishBy() + " ,осталосьпопыток: " + (5 - isUserAGoat), "Ошибка", JOptionPane.WARNING_MESSAGE);

return;

} // Проверкаввода xn

// if((x_end>x0_)&&(x_end<=xx)){}

else if (!(dataSet.getFinishBy() > dataSet.getStartBy() && dataSet.getFinishBy() <= dataSet.getxEnd())) {

isUserAGoat++;

JOptionPane.showMessageDialog(null, "Интервалхn долженбытьбольше, чем " + dataSet.getStartBy() + " именьше " + dataSet.getxEnd() + " ,осталосьпопыток: " + (5 - isUserAGoat), "Ошибка", JOptionPane.WARNING_MESSAGE);

return;

}

//обновляемзначениетекстовхметок

integrals[1].setText(Double.toString(dataSet.getFinishBy()));

integrals[2].setText(Double.toString(dataSet.getStartBy()));

integrals[3].setText(new BigDecimal(dataSet.getA() / 0.8, new MathContext(4)).toString());

mark = true;//введенныеданныеправильные

dataSet.inizial();////инициализацияданных

} catch (NumberFormatExceptionе) {

isUserAGoat++;

JOptionPane.showMessageDialog(null, "Введитекорректныезначения (цифры)\nосталосьпопыток: " + (5 - isUserAGoat), "Ошибка", JOptionPane.ERROR_MESSAGE);

return;

}

} else {

JOptionPane.showMessageDialog(null, "Выввелинекорректныеданные 5 раз, программабудетзакрыта!", "Ошибка", JOptionPane.ERROR_MESSAGE);

System.exit(0);

}

}

/*

*parserToDouble приводит текстовое значени к тип double, до точности 0.1

*/

private double parserToDouble(String text) {

return new BigDecimal(Double.parseDouble(text)).setScale(1, RoundingMode.HALF_UP).doubleValue();

}

//Панелидлятекстовыхкомпонентов, кнопок

private final JPanel mainPanel, footer, header, content;//Главная, боковая, леваяпанельфрейма

//Текстовыеметки

private JLabel topLabel, authorLabel;

private JLabel[] integrals, inputLabel;

// Переключателипанели:

private JTextField[] inputText; //техтполедлявводаданных

// Кнопкипанели:

private JButton paintButton, mathButton, clearButton; //кнопкидляпрорисовки, очисткипопосчетаданных

private int isUserAGoat = 0;// Ограничение на количество попыток

//классданныхинтеграла

private MethodDataSet dataSet;

private boolean mark = false;

}

//GridBagConstraints классопределяетограничениядлякомпонентов, которыеразмечаются, используя GridBagLayout класс.

class GBC extends GridBagConstraints {

public GBC(int gridx, int gridy) {

this.gridx = gridx;

this.gridy = gridy;

}

public GBC setAnchor(int anchor) {

this.anchor = anchor;

return this;

}

public GBC setWeight(double weightx, double weighty) {

this.weightx = weightx;

this.weighty = weighty;

return this;

}

public GBC setInsets(int distance) {

this.insets = new Insets(distance, distance, distance, distance);

return this;

}

}

package main;

import javax.swing.JFrame;// представляетсобойокно

// Класс с главным метoдoм прoграммы:

public class Main {

public static void main(String[] args) {

// Сoзданиеокна:

MainFrame main = new MainFrame(545, 500);//Размерокна

main.setTitle("Вычисление интеграла методом Эйлера");//Заголовок окна

//это нужно для того чтобы при

//закрытии окна закрывалась и программа,

//иначе она останется висеть в процессах

main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Показатьокно

main.setVisible(true);

main.setLocationRelativeTo(null);//расположениеокнапоцентру

main.setResizable(false);//запрещает менять окно приложения

}

}

packagegraph;

importdataSet.MethodDataSet;//классвведенныхданных

import java.awt.BasicStroke;//Штриховой набор атрибута.

import java.awt.Color;//Цвет

import java.awt.Dimension;//Dimension класс инкапсулирует ширину и высоту компонента

importjava.awt.Graphics;//Графика

importjava.awt.Graphics2D;//класс расширяется Graphics класс, чтобы обеспечить более сложное управление геометрией, скоординируйте преобразования, управление цветом, и текстовое расположение.

importjava.awt.Toolkit;//контейнерный объект является компонентом, который может содержать другие компоненты AWT.

importjava.awt.event.ActionEvent; //Интерфейс для событий, которые знают, как диспетчеризировать себя.

importjava.awt.event.ActionListener;//Интерфейс слушателя для того, чтобы получить события действия.

importjava.awt.geom.GeneralPath;//GeneralPath класс представляет геометрический путь, созданный из прямых линий, и квадратный и кубический (Bйzier) кривые.

importjava.math.BigDecimal;//Неизменная, произвольная точность подписанные десятичные числа.

importjava.math.RoundingMode;//Определяет округляющееся поведение для числовых операций, способных к отбрасыванию точности.

importjavax.swing.JButton;//Реализация кнопки "нажатия".

importjavax.swing.JFrame;//Расширенная версия java.awt.Frame это добавляет поддержку компонентной архитектуры JFC/Swing.

importjavax.swing.JPanel;//JPanel универсальный легкий контейнер.ы

// Класс фрейма:

public class Graph extends JFrame {

// Конструктор панели

// (аргумент - данные):

public Graph(MethodDataSet dataSet) {

// Получение размера всего экрана вызвав метод Toolkit.getDefaultToolkit().getScreenSize()

Dimension sSize = Toolkit.getDefaultToolkit().getScreenSize();

//Размер окна

myWidth = (int) sSize.getWidth() - 280;

myHeight = (int) sSize.getHeight() - 160;

setSize(myWidth + 30, myHeight + 100);

//Зоголовок окна:

setTitle("График y = f(x) на промежутке [" + dataSet.getStartBy() + ";" + dataSet.getFinishBy() + "], a= " + dataSet.getA() + " y20 = " + dataSet.getY2());

//Режим запрета изменения размеров окна:

setResizable(false);

//Расположение окна по центру:

setLocationRelativeTo(null);

panel = new JPanel(null);

add(panel);// Добавление панели в главное окно

this.dataSet = dataSet;

// Смещения

dx = 10;//по оси х

dy = 100;//по оси у

//Кнопка вернуться назад

returnBack = newJButton("Назад");

returnBack.setBounds(myWidth/2, myHeight+30, 100,20);//расположение кнопки

panel.add(returnBack);//добавляем кнопку в панель

returnBack.addActionListener(newActionListener() {

// Метод для обработки щелчка на кнопке:

public void actionPerformed(ActionEvent event) {

setVisible(false);//закрываем фрейм

}

});

}

// Метод отрисовки графика

@Override

public void paint(Graphics gr) {

super.paint(gr);

Graphics2D g = (Graphics2D) gr;

//Строим график

doublex = 0;

// Вспомогательне переменные, для масштабирования графика

double ampx = dataSet.getxEnd();

double ampy;

if (dataSet.getA() > 0) {

ampy = Min();

} else {

ampy = Max();

}

// Вычисляем коэффициент масштабирования

stepx = (myWidth - 90) / ampx;//коэф х

stepy = (myHeight - 80) / ampy;//коэф у

//Построение графика заданной функции

//площадь

GeneralPath square = new GeneralPath();//создается пустой объект класса GeneralPath

g.setColor(Color.YELLOW);//устанавливаем цвет

drawSquare(square);//вычисляем область, которую необходимо закрасить

g.fill(square);//закрышиваем область

g.draw(square);//рисуем на панели

GeneralPath graph = new GeneralPath();//создается пустой объект класса GeneralPath

g.setColor(Color.BLUE);//устанавливается цвет, который выбирает пользователь

drawToGraph(graph);//вызываем метод для прорисовки графика

g.setStroke(newBasicStroke(3.0f));//устанавливаем толщину линни 3

g.draw(graph);//рисуем на фрейме график

//сетку и сам график функции

GeneralPathpath = newGeneralPath();//создаетсяпустойобъектклассаGeneralPath

g.setColor(Color.BLACK);//устанавливаем черный цвет

g.setStroke(newBasicStroke(1.0f));//устанавливается толщина 1

//сетка

if (mark == true) {//проверяем, выбран chekbox

//Если выбран то

drawGridХ(path,dataSet.getxEnd(),10);//вызываем метод прорисовки линий по оси х

if (dataSet.getA() > 0) {//и для "у" вызываем метод прорисовки по у

drawGridY(path,g, Min(), 10);//для а>0 находим мин значение функции

} else {

drawGridY(path,g, Max(), 10);//иначе мах.

}

}

//линия оси у

path.moveTo(60, indent());//Переносим текущую точку в первую вершину

path.lineTo(60, indent() + sign() *dataSet.getYN()*stepy);//Переносим точку в конец линии

//линия оси х

path.moveTo(60, indent() + sign() * dataSet.getY(0)*stepy );//Переносим текущую точку в первую вершину

path.lineTo(dataSet.getxEnd()*stepx+90, indent() + sign() * dataSet.getY(0)*stepy );//Переносим точку в конец линии

g.draw(path);//рисуем эти линии

//вызов метода "подпись осей по х"

scaleX(g, dataSet.getxEnd(), 10);

//вызов метода "подпись осей по у"

if (dataSet.getA() > 0) {//если а>0, то находим минимум и для него считаем

scaleY(g, Min(), 10);

} else {//иначе мах

scaleY(g, Max(), 10);

}

//Подписываем ось х

g.drawString("х", (int) (dataSet.getxEnd()*stepx + 85), (int) (indentText() + sign() * (dataSet.getY(0)) * stepy));

//стрелки для оси х

g.drawLine((int) (dataSet.getxEnd() * stepx + 85), (int) (indentText() + sign() * (dataSet.getY(0)) * stepy+(dataSet.getA()>0 ? 0:-20)), (int) (dataSet.getxEnd() * stepx + 90), (int) (indentText() + sign() * (dataSet.getY(0)) * stepy+(dataSet.getA()>0 ? 5:-15)));

g.drawLine((int) (dataSet.getxEnd() * stepx + 85), (int) (indentText() + sign() * (dataSet.getY(0)) * stepy+(dataSet.getA()>0 ? 10:-10)), (int) (dataSet.getxEnd() * stepx + 90), (int) (indentText() + sign() * (dataSet.getY(0)) * stepy+(dataSet.getA()>0 ? 5:-15)));

//Подписываем ось у

g.drawString("у", (int) (45), (int) ((dataSet.getA()>0)?130+dataSet.getYN() * stepy :90+ dataSet.getY(0)*stepy));

//стрелки ось у

g.drawLine((int) (60), (int) ((dataSet.getA()>0)?90+dataSet.getYN() * stepy :200+ dataSet.getY(0)*stepy), (int) (60), (int) ((dataSet.getA()>0)?130+dataSet.getYN() * stepy :80+ dataSet.getY(0)*stepy));

g.drawLine((int) (60), (int) ((dataSet.getA()>0)?130+dataSet.getYN() * stepy :80+ dataSet.getY(0)*stepy), (int) (55), (int) ((dataSet.getA()>0)?125+dataSet.getYN() * stepy :85+ dataSet.getY(0)*stepy));

g.drawLine((int) (60), (int) ((dataSet.getA()>0)?130+dataSet.getYN() * stepy :80+ dataSet.getY(0)*stepy), (int) (65), (int) ((dataSet.getA()>0)?125+dataSet.getYN() * stepy :85+ dataSet.getY(0)*stepy));

//выводим начало оси

g.drawString("0.0", (int) (40), (int) (indentText() + sign() * (dataSet.getY(0)) * stepy));

//Площадь

g.drawString("- Площадь S", dx+65,dy-30);// Обозначение площади

//устанавливаем цвет S

g.setColor(Color.YELLOW);

g.setStroke(new BasicStroke(5.0f));///толщина линии 5

g.drawLine(dx+30, dy-35,dx+60, dy-35);//линия площади

}

/**Подписываем ox

* @paramg создаётся системой, а мы берём его в готовом виде и используем для рисования

* @paramvalue - мах значение

* @paramcount - чило отрезков

*/

public void scaleX(Graphics g, double value, int count) {

double variable = value / count; //переменная шага

for (int i = 1; i <= count; i++) {

g.drawString(Double.toString(new BigDecimal(variable).setScale(1, RoundingMode.HALF_UP).doubleValue()), (int) (variable * stepx + 50), (int) (indentText() + sign() * (dataSet.getY(0)) * stepy));

variable += value / count;//увеличиваем шаг

}

}

/**Подписываем oy

* @paramg -создаётся системой

* @paramcount - мин или мах значение функции

* @param value - чило отрезков

*/

public void scaleY(Graphics g, double value, int count) {

double variable = value / count;

for (int i = 1; i <= count; i++) {

g.drawString(Double.toString(new BigDecimal(variable).setScale(1, RoundingMode.HALF_UP).doubleValue()), (int) 23, (int) (indent() + sign() * variable * stepy));

variable += value / count;

}

}

/*GeneralPath

*@path - класс для работы с кривыми

*@moveTo - установка координаты первой точки

*@lineTo - постороение контура, передаем след координаты

*@closePath - замыкает кривую, который приводит линию в обратном направлении к начальной точке контура кривой

*/

/*

*moveToGraph()

*рисует график */

public GeneralPath drawToGraph(GeneralPath path) {

path.moveTo(dx + 50, indent() + sign() * (dataSet.getY(0)) * stepy);

for (int i = 1; i <= dataSet.getNx(); i++) {

x = dataSet.getH() * i;

path.lineTo(dx + x * stepx + 50, indent() + sign() * (dataSet.getY(i)) * stepy);

}

returnpath;

}

/*Выводим сетку*/

//рисует сетку по оси у

public GeneralPath drawGridY(GeneralPath path,Graphics2D g, double value, int count) {

double variable = value / count;

for (int i = 1; i <= count; i++) {

path.moveTo(60, (indent() + sign() * variable * stepy));

path.lineTo(60 + dataSet.getxEnd() * stepx, (indent() + sign() * variable * stepy));

variable += value / count;

}

return path;

}

public GeneralPath drawGridХ(GeneralPath path,double value, int count) {

double variable = value / count;

for (int i = 0; i < 11; i++) {

path.moveTo(variable * stepx + 60, indent() + sign() * (dataSet.getY(0)) * stepy);

path.lineTo(variable * stepx + 60, indent() + sign() * (dataSet.getYN()) * stepy);

variable += value / count;

}

return path;

}

/*Закрашиваем площадь фигуры*/

public GeneralPath drawSquare(GeneralPath path) {

//штриховка внитри фигуры

path.moveTo(dx + dataSet.getStartBy() * stepx + 50, indent() + sign() * (dataSet.getY(0)) * stepy);

for (int i = dataSet.getIntStartBy(); i <= dataSet.getNs(); i++) {

x = i * dataSet.getH();

path.lineTo(dx + x * stepx + 50, indent() + sign() * (dataSet.getY(i)) * stepy);

}

path.lineTo(dx + dataSet.getFinishBy() * stepx + 50, indent() + sign() * (dataSet.getY(0)) * stepy);

path.closePath();

returnpath;

}

//знак для установки начала оси координат

public double sign() {

if (dataSet.getA() < 0) {

return -1;

}

return 1;

}

//отступ для начало оси координат

publicdoubleindent() {

if (dataSet.getA() < 0) {

return myHeight + 30;

}

returndy + 10;

}

//отступначалоподписиосикоординат

public double indentText() {

if (dataSet.getA() < 0) {

return myHeight + 45;

}

return dy + 5;

}

//находим мин значения

private double Min() {

double min = dataSet.getY(0);

for (int i = 1; i <= dataSet.getNx(); i++) {

if (dataSet.getY(i) < min) {

min = dataSet.getY(i);

}

}

return min;

}

//находим мax значения

private double Max() {

double max = dataSet.getY(0);

for (int i = 1; i <= dataSet.getNx(); i++) {

if (dataSet.getY(i) > max) {

max = dataSet.getY(i);

}

}

return max;

}

//Сетка

public Graph setMark(boolean mark) {

this.mark = mark;

return this;

}

private int myWidth, myHeight;

private MethodDataSet dataSet;

// Отступоткраевокна

privateintdx, dy;

privatedoublex=0;

// Шаги по осям при рисовании

// Границы диапазона изменения координат:

privatedoublestepx;

privatedoublestepy;

// Состояние флажка вывода сетки:

privatebooleanmark = true;

//кнопка для возврата

private JButton returnBack;

//Панель для графика

private JPanel panel;

}

package dataSet;

//класс метода

public class Method {

private MethodDataSet data;//класс данных

//параметры метода

private double x;

private double sum = 0;

//конструкторпринимаетклассданных

publicMethod(MethodDataSetdata) {

this.data = data;

}

//считываем интеграл

public double getSum() {

return sum * data.getH();

}

//функция

private double F(double x) {

return -data.getA() * x * data.getY(2)-data.getY1()*math.pow(x,2);

}

//метод Эйлера

public void methodEuler() {

//Начальныеусловия

data.addY(0, data.getY1());

data.addY(1, data.getY2());

//Вычисляем для всех точек у[x]

for (int i = 1; i <= data.getNx(); i++) {

x = i * data.getH();

data.addY(i, data.getY(i - 1) + data.getH() * F(x));

}

}

public void setSum() {

int dlina = (int) Math.round((data.getFinishBy() - data.getStartBy()) / data.getH());

int nach = (int) Math.round(data.getStartBy() / data.getH());

for (int i = nach; i <= (nach + dlina); i++) {

sum += data.getY(i);

}

}

}

package dataSet;

public class MethodDataSet {

//Введенные данные

private double a;

//Интегрируемая область

private double startBy, xEnd, finishBy;

private int nx;

private int ns;

private int fs;

//шаг интегрирования

private double h=0.01;

private final double y1 = 0;

private double y2;

privatedouble[] y;

//метод нахождения интеграла

private Method method;

//инициализация данных

public void inizial(){

nx = (int) (xEnd / h);//количестворазбиений

y = newdouble[nx + 1];//длина массива

//Переменные для подсчета интеграла

//т.к интеграл вычисляется с определенной точки х1

//необходимо расчитать начало отчета отрезка

//и его длину

fs = (int) (Math.round(startBy / h));//начало отчета

ns = (int) (Math.round((finishBy - startBy) / h) + fs);//количество разбиений отрезка интегрирования

//подсчет интеграла

method = new Method(this);

method.methodEuler();//метод Эйлера

}

//подсчет суммы

public void setSum() {

method.setSum();

}

//получить сумму

public double getSum() {

returnmethod.getSum();

}

//установитьпеременнуюа

public MethodDataSet setA(double a) {

this.a = a;

return this;

}

//установить переменную h

public MethodDataSet setH(double h) {

this.h = h;

return this;

}

//установить переменную начало отрезка интегрирования

public MethodDataSet setStartBy(double startBy) {

this.startBy = startBy;

return this;

}

//установить переменную конеца отрезка

public MethodDataSet setxEnd(double xEnd) {

this.xEnd = xEnd;

return this;

}

//установить переменную конец отрезка интегрирования

public MethodDataSet setFinishBy(double finishBy) {

this.finishBy = finishBy;

return this;

}

//установить переменную у2

public MethodDataSet setY2(double y2) {

this.y2 = y2;

return this;

}

/**

* @return переменную A

*/

public double getA() {

return a;

}

/**

* @return переменную startBy

*/

public double getStartBy() {

return startBy;

}

/**

* @return переменную xEnd

*/

public double getxEnd() {

return xEnd;

}

/**

* @return переменную finishBy

*/

public double getFinishBy() {

return finishBy;

}

/**

* @return переменную nx

*/

public int getNx() {

return nx;

}

/**

* @return переменную ns

*/

public int getNs() {

returnns;

}

/**

* @returnпеременнуюns

*/

public int getIntStartBy() {

return fs;

}

/**

* @return переменную h

*/

public double getH() {

returnh;

}

/**

* @returnпеременнуюy1

*/

public double getY1() {

returny1;

}

/**

* @return переменную y2

*/

public double getY2() {

returny2;

}

/**

* @return переменную y

*/

public double getY(int i) {

returny[i];

}

//вернуть конечную у

public double getYN() {

return y[nx];

}

/**

* @добавляем в массив y

*/

public void addY(int i, double type) {

y[i] = type;

}

}

5. Руководство пользователя

1. Запускприложения.

Чтобы запустить программу, дважды щелкните левой кнопкой мыши по значку программы«Metod_Eilera.jar»на рабочем столе.

2. Работа с программой.

Вводим исходные данные.

Вводим исходные данные в открывшееся окно (Рисунок 5):

Рисунок 5- Окно приложения

Ввод данных необходимо производить последовательно. Во все поля окна рекомендуется вводить числовые значения: вещественные или целочисленные.

Значения в поле “y20” рекомендуется вводить значения от -50 до 50.

Значения в полях “X1=” и “Xn=” не должны быть больше “X=”.

Значение для поля “Xn=” должно быть не меньше или равно “X1=”

Значения в поле “а” рекомендуется вводить от -100 до -1.

Значения в поле “Область определения” рекомендуется вводить от 0 до 20.

Вычисляем интеграл.

Нажимаем на кнопку «Вычислить интеграл».

Программа выводит значение интеграла (Рисунок 6):

Рисунок 6 - Пример работы приложения.

Для вывода результата интегрирования и графической интерпретации нажимаем на кнопку «Нарисовать».

Открывается окно с графиком функции и его графическая интерпретация.

Рисунок 7-Пример графической интерпретации.

Сообщения об ошибках

Если в программе нет ошибок, то в результате нажатия кнопки «Нарисовать» программа запускается (Рисунок - Пример работы приложения.). Однако если в программе есть ошибки, то она не запускается, а появляется окошко с сообщением об ошибке.

Рисунок 8 - Пример обработки ошибки.

Нажимаем «ОК», далее после анализа причины ошибки и ее устранения нужно снова нажать на кнопку «Нарисовать».

В табл. 1 приведены сообщения о наиболее типичных ошибках:

Таблица 1 Сообщения о типичных ошибках

Тип ошибки

Устранение ошибки

Задайте корректный диапазон для х

Вероятно, вы ввели значение, которое выходит за пределы возможных значений для х(введите значение от 0 до 20).

Вышел за пределы диапазона допустимых значений для параметра х1;

Вероятно, вы ввели значение, которое выходит за пределы возможных значений для х1.

Введите корректные значения (цифры)!

Вероятно, вы ввели символ или букву в одно из полей.

Xnдолжно быть больше чем…и меньше чем…

Вероятно, что вы не соблюдаете правило: «Значения в полях “X1=” и “Xn=” не должно быть больше “X=”. Значения для поля “Xn=” должен быть не меньше и не равно “X1=”».

Задайте корректный диапазон допустимых значений для а.

Вероятно, вы ввели значение, которое выходит за пределы возможных значений для а (введите значение от -100 до -1)

3. Завершение работы Чтобы завершить работу с программой, надо просто закрыть его главное окно.

4. Повторное использование программы

Для того чтобы ввести другие значение для полей, необязательно заново открывать приложение. Нужно всего лишь закрыть окно «График», если оно открыто (нажав левой кнопкой мыши на кнопку «Закрыть» или нажав «Назад»). В главном окне нажимаем на кнопку «Очистить» и повторяем процедуру под пунктом 2.

6. Результаты работы для различных вариантов

При оценке поведения графика функции при различных значениях переменных, выявилось два различных расположения графика в координатной плоскости. Рассмотрим данные условия:

1)Коэффициенты a и y2(0) либо оба положительные, либо оба отрицательные

2)Коэффициенты a и y2(0) либо один из них положительный, а другой отрицательный, либо наоборот

Таблица 2-Результат работы программы.

Входные данные

Вариант 1

Вариант 2

Вариант 3

y2(0) - нижняя граница

10

5

13

x - конечное значение заданной функции

5.5

10

15.5

X0 - верхний предел интегрирования

1

2

7

Xn - нижний предел интегрирования

5

7

12.5

a -коэффициент

-10

-8

-4.5

Результаты расчета

Вариант 1

Вариант 2

Вариант 3

S - искомое значение интеграла

774,843

3295,249

154184,169

На рисунках далеепредставлены результаты работы программы для трех вариантов тестирования, приведенных в таблице.

Рисунок 9- Первый вариант.

Рисунок 10 График

Рисунок 11 Проверка

Рисунок 12 - Второй вариант

Рисунок 13 Проверка

Рисунок 14 График

Рисунок 15 - Третий вариант

Рисунок 16 Проверка

Рисунок 17 График

7. Тестовые примеры

7.1 Некорректный ввод данных

Приложение работает с числовыми данными, поэтому при вводе любых не числовых значений возникает ошибка.

Рисунок 18 Обработка некорректного ввода данных.

7.2 Недостаточно данных

Допустим, что пользователь не ввел требуемые данные. Следовательно, приложение не сможет выполнить запрашиваемые действия, оно выведет ошибку

Рисунок 19 - Обработка ввода недостаточных данных.

7.3 Выход за границы значений

Допустим, что пользователь не заметил или проигнорировал условия ввода данных и вышел за границы заданного промежутка какого-либо значения. Приложение также выведет ошибку.

Рисунок 20-Пример 1.

Рисунок 21 -Пример 2.

Рисунок 22-Пример 3.

7.4 Ограниченное количество ввода данных

Если пользователь пытается запустить программу с неверными данными более 5 раз, программа автоматически завершает свою работу.

Рисунок 23 - Ограниченное количество ввода данных.

Выводы

В ходе выполнения курсовой работы выполнена цель: найти приближенное решение обыкновенного дифференциального уравнения y'=f(x), y(0)=0 методом Эйлера на отрезке [a,b] с заданным постоянным шагом h.

С использованием языка программирования «Java» было найдено приближенное решение обыкновенного дифференциального уравнения.

В процессе выполнения данной курсовой работы были приобретены навыки работы с нетривиальными возможностями Java. Получил навык работы с графическим интерфейсом, изучил такие библиотеки как Swing, AWT и т.д.

Полученные знания могут быть полезны при разработке инженерных задач.

Список использованной литературы

1. Машнин Т. С. М38 Современные Java-технологии на практике. -- СПб.: БХВ-Петербург, 2010. -- 560 с.

2. Васильев А. Н. В19 Java. Объектно-ориентированное программирование: Учебное пособие. --СПб.: Питер, 2011. -- 400 с.ISBN 978-5-49807-948-6

3. ГОСТ 7.1 - 2003. Библиографическое описание документа. Общие требования и правила составления [текст] - взамен ГОСТ 7.1-84, ГОСТ 7.16-79, ГОСТ 7.18-79, ГОСТ 7.34-81, ГОСТ 7.40-82 - введ. 2004 - 07 - 01. - М.: Издательство стандартов, 2004. - 141с. - (Система стандартов по информации, библиотечному и издательскому делу).

4. ГОСТ 7.82 - 2001. Библиографическая запись. Библиографическое описание электронных ресурсов. Общие требования и правила составления [текст] - введ. 2002 - 07 - 01 - М.: Издательство стандартов, 2001. - 35с. - (Система стандартов по информации, библиотечному и издательскому делу).

5. ГОСТ 19.701 - 90 (ИСО 5807 - 85) Схемы алгоритмов, программ, данных и систем [текст]. - взамен ГОСТ 19.002-80, ГОСТ 19.003-80 - введ. 1992 - 01 - 01. - М.: Государственный стандарт союза ССР, 1990. - 22с.

6. Васильев А.Н.Java. Объектно-ориентированное программирование: Учебное пособие. - СПб.: Питер, 2014. - 400с.

7. Редактор схем [Электронный ресурс]: содержится информация о редакторе схем, доступна ссылка для скачивания. - Электрон. дан. - режим доступа: http://alglib.sources.ru/aboutbls.php

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.