Решение дифференциальных уравнений методом Рунге-Кутты

Реализация решения обыкновенных дифференциальных уравнений 1-го и 2-го порядка методом Рунге-Кутты. Построение на ЭВМ системы отображения результатов в табличной форме и в виде графика. Архитектура и требования к разрабатываемым программным средствам.

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

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

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

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

Содержание

ВВЕДЕНИЕ

1. ПОСТАНОВКА ЗАДАЧИ

2. ОБЗОР ЛИТЕРАТУРЫ

2.1 Методы решения

2.2 Общая постановка задачи решения ОДУ

3. ПРОЕКТИРОВАНИЕ МАТЕМАТИЧЕСКОГО ОБЕСПЕЧЕНИЯ

3.1 Математический метод решения задачи

3.1.1 Блок-схема метода Рунге-Кутты

3.1.2 Анализ погрешности метода

3.1.3 Достоинства и недостатки метода

3.2 Архитектура разрабатываемых програмних средств

3.3 Требования к программному изделию

3.4 Требования к программной документации

4. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

5. ЭКСПЕРИМЕНТАЛЬНЫЕ РАСЧЕТЫ

5.1 Контрольные примеры для решения на ЭВМ

5.2 Экспериментальные расчеты

ЗАКЛЮЧЕНИЕ

ЛИТЕРАТУРА

ПРИЛОЖЕНИЕ

ВВЕДЕНИЕ

Дифференциальные уравнения - это уравнения, в которых неизвестными являются не переменные (т. е. числа), а функции одной или нескольких переменных. Эти уравнения (или системы) включают соотношения между искомыми функциями и их производными. Если в уравнения входят производные только по одной переменной, то они называются обыкновенными дифференциальными уравнениями (ОДУ). В противном случае говорят об уравнениях в частных производных. Таким образом, решить дифференциальное уравнение - значит определить неизвестную функцию на определенном интервале изменения ее переменных.

Как известно, одно обыкновенное дифференциальное уравнение или система ОДУ имеет единственное решение, если помимо уравнения определенным образом заданы начальные или граничные условия. В соответствующих курсах высшей математики доказываются теоремы о существовании и единственности решения в зависимости от тех или иных условий. Имеются два типа задач:

1. задачи Коши - для которых определены начальные условия на искомые функции, т. е. заданы значения этих функций в начальной точке интервала интегрирования уравнения;

2. краевые задачи - для которых заданы определенные соотношения сразу на обеих границах интервала.

Как правило, решение задач Коши для ОДУ - задача, хорошо разработанная и с вычислительной точки зрения не слишком сложная. Большое значение здесь имеет представление результатов и анализ зависимостей решения от различных параметров системы.

В данной работе рассматривается один из способов решение дифференциальных уравнений - метод Адамса.

1. ПОСТАНОВКА ЗАДАЧИ

Целью данного проекта есть реализация решения ОДУ 1-го и 2-го порядка методом Рунге-Кутты и построение на ЭВМ системы отображения результатов в табличной форме и в виде графика.

Разрабатываемая программа должна выполнять следующие функции:

1) Ввод пользователем данных.

2) Построение на их основе дифференциального уравнения.

3) Проведение анализа такой модели на адекватность, построение графика.

4) Анализ результатов.

5) Вывод полученных результатов на экран.

Данная программа должна работать на любом персональном компьютере с процессором Pentium и объемом оперативной памяти, не менее 256 Мб.

Необходимым условием правильной работы программы является факт установления на ЭВМ JVM (Java Virtual Machine, виртуальной машины Джава - специального программного средства, необходимого для работы программ файлов разрабатываемой программы).

2. ОБЗОР ЛИТЕРАТУРЫ

2.1 Методы решения

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

Методы их решения подразделяются на два класса:

аналитические методы, в которых решение получается в виде аналитических функций;

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

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

2.2 Общая постановка задачи решения обыкновенных дифференциальных уравнений

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

Конкретная прикладная задача может приводить к дифференциальному уравнению любого порядка или системе уравнений любого порядка. Однако обыкновенные дифференциальные уравнения n-го порядка можно с помощью замены свести к эквивалентной системе n уравнений первого порядка.

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

Пусть задано дифференциальное уравнение первого порядка в виде

(1.1)

и начальное условие

(1.2)

Задача Коши состоит в том, чтобы найти функцию

,

являющуюся решением уравнения (1.1) и удовлетворяющую условию(1.2).

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

3. ПРОЕКТИРОВАНИЕ МАТЕМАТИЧЕСКОГО ОБЕСПЕЧЕНИЯ

3.1 Математический метод решения задачи

Метод Рунге-Кутта

Метод Рунге-Кутта -- важное семейство численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Формально, методом Рунге -- Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Наиболее часто используется и реализована в различных математических пакетах (Matlab, MathCAD) стандартная схема четвёртого порядка.

Метод Рунге--Кутты 4 порядка

Рассмотрим задачу Коши

Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:

где h -- величина шага сетки по x и вычисление нового значения проходит в четыре стадии:

Этот метод имеет четвёртый порядок точности, т.е. суммарная ошибка на конечном интервале интегрирования имеет порядок O(h4) (ошибка на каждом шаге порядка O(h5)) [1].

3.1.1 Блок схема метода Рунге-Кутты

3.1.2 Анализ погрешности метода Рунге-Кутты

Из теории приближенных методов известно, что при шаге интегрирования h имеет место оценка

,

так что погрешность одного шага вычислений имеет порядок . Суммарная погрешность за n шагов будет порядка . Отсюда, если увеличить n в два раза. То погрешность уменьшиться примерно в 16 раз. Поэтому для оценки приближенного решения , полученного с шагом h, повторяют вычисление с шагом 2h и за абсолютную погрешность принимают число

,

где - приближенное решение с шагом 2h.

Приведенная оценка является оценкой метода и не учитывает погрешность при округлении.[2]

3.1.3Достоинства и недостатки метода Рунге-Кутты

Методы Рунге-Кутта обладают следующими отличительными свойствами:

* Эти методы одноступенчатые: чтобы найти y[m+1], нужна информация только о предыдущей точке x[m],y[m].

* Они согласуются с рядом Тейлора вплоть до членов порядка h^p,

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

* Они не требуют вычисления производных от f(x,y), а требуют только вычисления самой функции.

Именно благодаря 3) эти методы удобны для практических вычислений, однако для вычисления одной последующей точки решения нам придется вычислять f(x,y) несколько раз при различных x и y.

3.2 Архитектура разрабатываемых програмних средств

Схема взаимодействия программ

Рис1. Структурная схема программы

Программа представляет собой следующие функциональные блоки :

Управляющая программа:

функции: общее управление программой;

вх.данные: команды пользователя и ОС;

вих. данные: управляющие команды другими блоками программы;

Подпрограмма изображения пользовательского интерфейса:

функции: изображение удобных для пользователя элементов управления и руководство ими;

вх. данные: типы элементов управление, их свойства;

вых. данные: элементы управления на экране, меню;

Подпрограмма ввода данных:

функции: ввод данных пользователем;

вх. данные: исходные данные, метод получения информации;

вых. данные: преобразование входных данных во внутренние переменные;

Подпрограмма метод Рунге-Кутта:

функции: нахождение очередной точки

вх. данные: начальная точка, шаг, значение функции и производной в ней ;

вых. данные: масив значений производных в четырех точках;

Подпрограмма вывода результатов:

функции: вывод результатов работы программы;

вх. данные: массивы значений связанных определенным отношением x и y(x) отображающие результаты расчёта произвольного дифференциального уравнения 1-го или 2-го порядка методом Рунге-Кутты;

вых. данные: результаты работы программы на экране;

Подпрограмма графического представления результатов:

функции: вывод на экран графического представления результатов;

вх. данные: : массивы значений связанных определенным отношением x и y(x) отображающие результаты ращета произвольного дифференциального уравнения 1-го и 2-го порядка методом Адамса;

вых. данные: вывод решаемого графика;

Подпрограмма выдачи контекстной справки:

функции: выдача справки;

вх. данные: нет;

вых. данные: справочная информация о системе на экране;

3.3 Требования к программному изделию

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

Требования к техническим средствам:

· процессор не ниже Pentium II

· Процессор частотой 1000 Мгц

· ОЗУ - от 5 Мб.

Требования к программным средствам:

· OC Windows 98/NT/ME/2000/XP/7.

· Java Virtual Machine(JVM)

Состав программного продукта:

· подпрограмма получения данных;

· подпрограмма сравнения и управления;

· подпрограмма решения дифференциальных уравнений

методом Адамса;

· подпрограмма вывода результатов.

3.4 Требования к программной документации

Перечень программных документов:

· Техническое задание;

· Пояснительная записка;

· Эскизный проект;

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

4. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Пользовательский интерфейс разработан, используя язык объектно-ориентированного программирования Java. Исходя из этого, пользователю рекомендуется установить среду NetBeans.

При запуске программы открывается окно, представленное на рис.1.

Рис.1 Главное окно

Для вивода справки нужно нажать "Help".

Рис.2. Справка о работе с программой

Чтобы описать задачу пользователя, то есть указать задачу Коши, которую необходимо решить, нужно нажать кнопку Equation и появится следущее окно

Рис.3. Создание задачи

В окне задачи, которое появится необходимо установить такие поля: Порядок(указывает какого порядка уравнение будем решать. Возможные значения: "" - не выбрано, "Первый" - первого порядка, "Второй"-второго порядка), Уравнение(может вмещать любую формулу использую стандартную библиотеку Math, для удобства описание наиболее часто используемые функций было сокращено. Сокращенная запись Math.cos(x)acos(x), Math.sin(x)asin(x), Math.tan(x)atan(x), Math.pow(x,y) =>pow(x,y) - вознесение в степень у значение х, остальные тригонометрические, а также иные функции следует использовать как стандартные вызовы функций из библиотеки Math, Точка x0(условие задачи Коши, может быть дробным, если надо указать его дробным, соблюдайте следующий формат целая_часть.дробная_часть), Точка y(x0)( условие задачи Коши, может быть дробным, если надо указать его дробным, соблюдайте следующий формат целая_часть.дробная_часть).

Точка y'(x0) (может быть задана при решении уравнения второго порядка, условие задачи Коши, может быть дробным, если надо указать его дробным, соблюдайте следующий формат целая_часть.дробная_часть), Шагов (указать во сколько шагов осуществить решение, этот параметр повлияет на точечность графика), Интервал (интервал, на котором будет отображена функция, нижняя_граница_интервала: верхняя_граница_интервала, интервал задается так чтобы нижняя граница интервала была меньше верхней и больше x0, заданного ранее). Вид формы представлен на Рис.4.

Рис.4. Введение основных параметров для решения диф. уравнения.

Чтобы подтвердить заданные параметры следует нажать кнопку `Solve' внизу окна. Отменить и закрыть форму можно с помощью кнопки `Cancel'. Появится окно с решением(рис. 5)

Рис. 5 Результаты расчётов

Чтобы на основании сгенерированной таблицы решения уравнения построить график следует нажать кнопу `Make graph', которая находится справа от таблицы (Рис.6.).

Рис.6.Построение графика

5. ЭКСПЕРИМЕНТАЛЬНЫЕ РАСЧЕТЫ

5.1 Контрольные примеры для решения на ЭВМ

Контрольный пример №1

дифференциальный уравнение программный график

Контрольный пример №2

y'(x)=x*(y2+1)

Решением данного дифференциального уравнения есть функция tan(x) которая имеет разрывы. Поскольку деление на нуль невозможно, эти функции определены не для всех значений аргумента. Тангенс определен для всех x?р/2+рn, n€Z. Функция непрерывна на всей области определения и имеют разрывы в точках вида р/2+рn. Поскольку метод Адамса ищет значение в точках, зависящих от предыдущих точек , то в данной функции наступит момент когда решение в следующие точке отобразить нельзя, т.к оно стремится к ?. Это видно исходя из графика tan(x).

5.2 Экспериментальные расчеты

Контрольный пример №1

Решение дифференциального уравнения вида y'(x)=1+y+x

Контрольный пример №2

Решение дифференциального уравнения вида y'(x)=tan(x)

Контрольный пример №3

Решение дифференциального уравнения вида y'(x)=x*(x2+1)

Контрольный пример №4

Решение дифференциального уравнения вида y'(x)=x*(y2+1)

В данном примере решения нет . В связи с тем что решением задачи коши есть функция tan(x) которая на интервале [2.0;9.0] является разрывной и при значении р уходит в ?.

Контрольный пример №5

Решение дифференциального уравнения вида y''(x)=x+y+z+cos(z)

Контрольный пример №6

Решение дифференциального уравнения вида y''(x)=cos(x)+y+tan(z)

ЗАКЛЮЧЕНИЕ

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

Готовый программный продукт может найти широкое применение при решении многих прикладных технических задач, а в частности, эффективно использование применённого метода Рунге-Кутты для решения ОДУ, для которых существует лишь численное решение.

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

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

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

1) Перевести интерфейс на русский язык, что поможет пользователям, плохо знакомым с английским

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

3) Изменить поведение программы для разрывных функций - в таком случае не обходимо будет вводить данные о значении функции и её производных сразу за точками разрыва

4) Добавить возможность импорта результатов в Excel-документы

ЛИТЕРАТУРА

1. http://ru.wikipedia.org/wiki/Метод_Рунге_--_Кутта

2. Алексеев Е.Р, Чеснокова О.В. Решение задач вычислительной математики в пакетах Mathcad 12, MATLAB 7, Maple 9

3. Тихонов А. Н., Горбунов А. <Д., "Ж. Вычисл. матем. и матем. физ.", 1962, т. 2, № 4, с. 537-48;

4. Лозинский С. М., "Изв. высш. учебн. заведений. Математика", 1958, М" 5, с. 52-90;

5. Беленький В. 3., в сб.: Вычислительные методы и программирование, М., 1965, с. 253-61;

7 .Бахвалов Н. С., Численные методы, 2 изд., М., 1975;

8.Березин И. С., Жидков Н. П., Методы вычислений, 2 изд., т. 2, М., 1962;

Приложение

Листинги Программы

RungeKuttForm

package ua.kpi.visuals;

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

/**

* Constructs the main window

*

* @author w1ld_b0ar, KM-71

* @version 2011.0407

*

*/

public class RungeKuttForm extends JFrame {

//--Menus

private JMenu jMenuAction = new JMenu("Terminate");

private JMenu jMenuHelp = new JMenu("Help");

private JMenu jMenuCreate = new JMenu("Equation");

private JMenuBar jMenuBar = new JMenuBar();

private JDesktopPane jdpDesktop;

public JDesktopPane getJdpDesktop() {

return jdpDesktop;

}

static {

for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(laf.getName())) {

try {

UIManager.setLookAndFeel(laf.getClassName());

UIManager.put("oceanBase", new Color(51, 51, 51));

UIManager.put("oceanBlueGrey", new Color(204, 204, 204));

UIManager.put("control", new Color(255, 255, 255));

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

{//--forming all the menus and adding them to jMenuBar on top

jMenuAction.setMnemonic(KeyEvent.VK_A);

jMenuAction.add(new CloseAction());

jMenuAction.addSeparator();

jMenuAction.add(new ExitAction());

jMenuBar.add(jMenuAction);

jMenuBar.add(new JButton(new CreateTask(this)));

jMenuBar.add(new JMenuItem(new HelpAction(this)));

}

//--describes reaction if frame closed

class CloseAction extends AbstractAction {

CloseAction() {

super("Close all");

putValue(MNEMONIC_KEY, KeyEvent.VK_O);

}

public void actionPerformed(ActionEvent e) {

for (JInternalFrame frame : jdpDesktop.getAllFrames()) {

frame.dispose();

}

}

}

/**

* Constructs Main form

* @throws HeadlessException

*/

public RungeKuttForm() throws HeadlessException {

super("Runge-Kutt Method");

setDefaultCloseOperation(EXIT_ON_CLOSE);

jdpDesktop = new JDesktopPane();

getRootPane().setContentPane(jdpDesktop);

setSize((int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.9),

(int) (Toolkit.getDefaultToolkit().getScreenSize().height * 0.1));

FrameDragger frameDragger = new FrameDragger(this);

jMenuBar.addMouseListener(frameDragger);

jMenuBar.addMouseMotionListener(frameDragger);

setJMenuBar(jMenuBar);

JPanel panelView = new JPanel();

JLabel text = new JLabel();

text.setFont(new Font("Serif", Font.ITALIC, 16));

text.setForeground(Color.WHITE);

text.setText("This program is designed to solve Cauchy problem with"

+ " Runge-Kutt method. It solves differential equations of"

+ " first and second levels. Click \"Equation\" to start.");

panelView.add(text);

panelView.setBackground(Color.DARK_GRAY);

setContentPane(panelView);

jdpDesktop.putClientProperty("JDesktopPane.dragMode", "outline");

setLocationRelativeTo(null);

setVisible(true);

setResizable(true);

}

/**

* Start point

* @param args

*/

public static void main(String... args) {

new RungeKuttForm();

}

}

TableModel

package ua.kpi.visuals;

import java.util.Arrays;

import javax.swing.table.AbstractTableModel;

public class TableModel extends AbstractTableModel {

// private double[][] data;

private String[] columnName = new String[] { "X", "Y(x)" };

double[] xdata, ydata;

public TableModel(double[] xdata, double[] ydata) {

this.xdata = Arrays.copyOf(xdata, xdata.length);

this.ydata = Arrays.copyOf(ydata, ydata.length);

}

@Override

public int getRowCount() {

return xdata.length; // To change body of implemented methods use

// File | Settings | File Templates.

}

@Override

public int getColumnCount() {

return 2; // To change body of implemented methods use File | Settings

// | File Templates.

}

@Override

public Object getValueAt(int rowIndex, int columnIndex) {

switch (columnIndex) {

case 0:

return xdata[rowIndex];

default:

return ydata[rowIndex];

}

}

@Override

public String getColumnName(int column) {

return columnName[column];

}

@Override

public boolean isCellEditable(int rowIndex, int columnIndex) {

return false;

}

@Override

public Class<?> getColumnClass(int columnIndex) {

return Double.class;

}

}

TableModel2

package ua.kpi.visuals;

import java.util.Arrays;

import javax.swing.table.AbstractTableModel;

public class TableModel2 extends AbstractTableModel {

// private double[][] data;

private String[] columnName = new String[] { "X", "Y(x)","Y'(x)" };

double[] xdata, ydata, zdata;

public TableModel2(double[] xdata, double[] ydata,double[] zdata) {

this.xdata = Arrays.copyOf(xdata, xdata.length);

this.ydata = Arrays.copyOf(ydata, ydata.length);

this.zdata = Arrays.copyOf(zdata, zdata.length);

}

@Override

public int getRowCount() {

return xdata.length; // To change body of implemented methods use

// File | Settings | File Templates.

}

@Override

public int getColumnCount() {

return 3; // To change body of implemented methods use File | Settings

// | File Templates.

}

@Override

public Object getValueAt(int rowIndex, int columnIndex) {

switch (columnIndex) {

case 0:

return xdata[rowIndex];

case 1:

return ydata[rowIndex];

default:

return zdata[rowIndex];

}

}

@Override

public String getColumnName(int column) {

return columnName[column];

}

@Override

public boolean isCellEditable(int rowIndex, int columnIndex) {

return false;

}

@Override

public Class<?> getColumnClass(int columnIndex) {

return Double.class;

}

}

TaskFrame

package ua.kpi.visuals;

import javax.swing.*;

import ua.kpi.rungekutt.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.beans.PropertyVetoException;

public class TaskFrame extends JDialog {

private RungeKuttForm basicForm;

static int openFrameCount = 0;

static final int xOffset = 30, yOffset = 30;

private JPanel contentPane = new JPanel();

private DiffValues myDif;

public TaskFrame(final DiffValues valXY, RungeKuttForm basicForm)

throws PropertyVetoException {

super();

setLayout(new FlowLayout());

setResizable(false);

setTitle("Equation ?" + (openFrameCount + 1) + ": "

+ valXY.getG().toString());

this.basicForm = basicForm;

final JTable table = new JTable(new Object[][]{}, new String[]{"x","y"});

table.setBorder(BorderFactory.createLineBorder(Color.BLACK,2));

table.setForeground(Color.darkGray);

setLocationByPlatform(true);

// -- perfoms adams method for an equation

DiffValues diffRes = MainMethod.action(valXY.getA(), valXY.getB(),

valXY.getN(), valXY.getG(),valXY.getX0(), valXY.getYX0());

myDif = diffRes;

setSize(new Dimension(

(int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.28),

(int) (Toolkit.getDefaultToolkit().getScreenSize().height * 0.48)));

table.setModel(new TableModel (diffRes.getXi(),diffRes.getYi()));

JButton showGraphButton = new JButton("Make graph");

showGraphButton.setSize(30, 50);

showGraphButton.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent arg0) {

showGraphClick();

}});

JPanel tablePanel = new JPanel();

JScrollPane jSP = new JScrollPane(table);

tablePanel.add(showGraphButton);

tablePanel.add(jSP);

tablePanel.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2));

tablePanel.setBackground(Color.LIGHT_GRAY);

add(tablePanel);

setAlwaysOnTop(true);

openFrameCount++;

pack();

}

private void showGraphClick() {

ChartFrame frame = new ChartFrame(myDif.getXi(), myDif.getYi(), Double

.toString(myDif.getA()), Double.toString(myDif.getB()));

frame.setVisible(true);

}

}

TaskFrame2

package ua.kpi.visuals;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.beans.PropertyVetoException;

import javax.swing.*;

import ua.kpi.rungekutt.*;

public class TaskFrame2 extends JDialog {

private RungeKuttForm basicForm;

static int openFrameCount = 0;

static final int xOffset = 30, yOffset = 30;

private JPanel contentPane = new JPanel();

private DiffValues myDif;

public TaskFrame2(final DiffValues valXYZ, RungeKuttForm basicForm)

throws PropertyVetoException {

super();

setLayout(new FlowLayout());

setResizable(false);

setTitle("Equation ?" + (openFrameCount + 1) + ": "

+ valXYZ.getF().toString());

this.basicForm = basicForm;

final JTable table = new JTable();

setLocationByPlatform(true);

//-- perfoms adams method for an equation

DiffValues diffRes = MainMethod.action2(valXYZ.getA(), valXYZ.getB(),

valXYZ.getN(), valXYZ.getF(),valXYZ.getX0(), valXYZ.getYX0(), valXYZ.getYPohX0());

myDif = diffRes;

setSize(new Dimension(

(int) (Toolkit.getDefaultToolkit().getScreenSize().width * 0.28),

(int) (Toolkit.getDefaultToolkit().getScreenSize().height * 0.48)));

table.setModel(new TableModel2 (diffRes.getXi(),diffRes.getYi(),diffRes.getYPohi()));

add(new JScrollPane(table));

setAlwaysOnTop(true);

final JButton showGraphButton = new JButton("Make graph");

showGraphButton.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent arg0) {

showGraphClick();

}});

add(showGraphButton);

openFrameCount++;

pack();

}

private void showGraphClick(){

ChartFrame frame = new ChartFrame(myDif.getXi(), myDif.getYi(), Double.toString(myDif.getA()),Double.toString(myDif.getB()));

frame.setVisible(true);

}

}

ChartFrame

/**

*

*/

package ua.kpi.visuals;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Toolkit;

import java.util.Arrays;

import javax.swing.JDialog;

import javax.swing.JFrame;

import javax.swing.JLabel;

import org.jfree.chart.ChartFactory;

import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.plot.PlotOrientation;

import org.jfree.data.function.Function2D;

import org.jfree.data.function.NormalDistributionFunction2D;

import org.jfree.data.general.DatasetUtilities;

import org.jfree.data.xy.XYDataset;

import org.jfree.data.xy.XYSeries;

import org.jfree.data.xy.XYSeriesCollection;

/**

*

*

* Describes all actions with graphics

*

*

* @author w1ld_b0ar, KM-71

* @version 2011.2003

*/

public class ChartFrame extends JDialog {

/**

* Solution : x coordinates

*/

private double[] xi;

/**

* Solution : y coordinates

*/

private double[] yi;

/**

* Constructs the chart frame, calling for constructing XYdataset and

* creating a line chart

*

* @param xi

* Solution: x

* @param yi

* Solution: y

* @param a

* Low-limit

* @param b

* High-limit

*

*/

public ChartFrame( double[] xi, double[] yi, String a, String b) {

setResizable(false);

this.xi = Arrays.copyOf(xi, xi.length);

this.yi = Arrays.copyOf(yi, yi.length);

// -creates series of data we should show

XYDataset dataset = createDataset();

// --creates new chart

final JFreeChart chart = ChartFactory.createXYLineChart(

"Solution for ["

+ a + ";" + b + "] ", "X", "Y", dataset,

PlotOrientation.VERTICAL, true, true, false);

final ChartPanel chartPanel = new ChartPanel(chart);

// --show result

chartPanel.setPreferredSize(new java.awt.Dimension(400, 400));

setContentPane(chartPanel);

setAlwaysOnTop(true);

setSize(new java.awt.Dimension(400, 400));

pack();

}

/**

* Creates series to show

*

* @return Created dataset

*/

private XYDataset createDataset() {

// -- Creates series, set name of series

final XYSeries mySeries = new XYSeries(

"Cauchy problem solution Y(X)");

// -- forms new series

for (int i = 0; i < xi.length; i++) {

mySeries.add(xi[i], yi[i]);

}

// -- pushes to one collection and adds this collection to the dataset

final XYSeriesCollection dataset = new XYSeriesCollection();

dataset.addSeries(mySeries);

// -- resulting dataset

return dataset;

}

public ChartFrame() {

}

}

CreateTask

package ua.kpi.visuals;

import javax.swing.*;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

/**

*/

public class CreateTask extends AbstractAction{

private RungeKuttForm rungeKuttForm;

public CreateTask(RungeKuttForm basicForm) {

super("Equation");

putValue(MNEMONIC_KEY, KeyEvent.VK_C);

this.rungeKuttForm=basicForm;

}

public void actionPerformed(ActionEvent e) {

new CreateTaskDialog(rungeKuttForm);

}

}

CreateTaskDialog

package ua.kpi.visuals;

import javax.swing.*;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

/**

*/

public class CreateTask extends AbstractAction{

private RungeKuttForm rungeKuttForm;

public CreateTask(RungeKuttForm basicForm) {

super("Equation");

putValue(MNEMONIC_KEY, KeyEvent.VK_C);

this.rungeKuttForm=basicForm;

}

public void actionPerformed(ActionEvent e) {

new CreateTaskDialog(rungeKuttForm);

}

}

ExitAction

package ua.kpi.visuals;

import javax.swing.*;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

/**

*/

public class ExitAction extends AbstractAction{

public ExitAction() {

super("Exit");

putValue(MNEMONIC_KEY, KeyEvent.VK_E);

}

public void actionPerformed(ActionEvent e) {

System.exit(0);

}

}

FrameDragger

package ua.kpi.visuals;

/**

*/

import javax.swing.*;

import java.awt.*;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionListener;

import java.awt.event.MouseListener;

/**

*/

class FrameDragger implements MouseListener, MouseMotionListener {

private JFrame frameToDrag;

private Point lastDragPosition;

private JDialog frameToDrag1;

public FrameDragger(JFrame frameToDrag) {

this.frameToDrag = frameToDrag;

}

public FrameDragger(JDialog frameToDrag) {

this.frameToDrag1= frameToDrag;

}

public void mouseDragged(MouseEvent e) {

Point currentDragPosition = e.getLocationOnScreen();

int deltaX = currentDragPosition.x - lastDragPosition.x;

int deltaY = currentDragPosition.y - lastDragPosition.y;

if (deltaX != 0 || deltaY != 0) {

if(frameToDrag!=null) {

int x = frameToDrag.getLocation().x + deltaX;

int y = frameToDrag.getLocation().y + deltaY;

frameToDrag.setLocation(x, y); }

else {

int x = frameToDrag1.getLocation().x + deltaX;

int y = frameToDrag1.getLocation().y + deltaY;

frameToDrag1.setLocation(x, y);

}

lastDragPosition = currentDragPosition;

}

}

public void mouseMoved(MouseEvent e) {

}

public void mouseExited(MouseEvent e) {

}

public void mouseEntered(MouseEvent e) {

}

public void mouseReleased(MouseEvent e) {

}

public void mouseClicked(MouseEvent e) {

if(e.getClickCount()==2&&e.getButton()== MouseEvent.BUTTON1) {

if(frameToDrag!=null) {

frameToDrag.setState(Frame.ICONIFIED);

}

}

}

public void mousePressed(MouseEvent e) {

lastDragPosition = e.getLocationOnScreen();

}

}

HelpAction

package ua.kpi.visuals;

import javax.swing.*;

import java.awt.event.ActionEvent;

import java.awt.event.KeyEvent;

/**

*/

public class HelpAction extends AbstractAction

{

private RungeKuttForm basicForm;

public HelpAction(RungeKuttForm basicForm) {

super("Help");

this.basicForm = basicForm;

putValue(MNEMONIC_KEY, KeyEvent.VK_I);

}

public void actionPerformed(ActionEvent e) {

new HelpDialog(basicForm);

}

}

HelpDialog

package ua.kpi.visuals;

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

/**

*/

public class HelpDialog extends JDialog {

private JPanel contentPane = new JPanel();

private JButton buttonOK = new JButton("Close");

private JTextArea infoTextArea = new JTextArea();

{

infoTextArea.setFont(new Font("Serif", Font.ITALIC, 14));

infoTextArea.setText(

" ->To start set all the parametres needed due to:\n" +

"1. x0,y(x0),y'(x0) => double values"+"\n"+

"2. Values for interval should be described like " +"\n"+

" low_value:high_value, for example 3:4. This shows we want to build from 3 to 4."+"\n"+

"3. If second pow eqaution prefered we replace y'(x) by z, so y''(x)=y'(x)+x"+"\n"+

" would be y''(x)=z+x."+"\n"+

"4. Steps needed are integer values."+"\n"+

"5. To close Equation panel push Cancel or Close all on Equation->Close all tip."+"\n"

);

}

public HelpDialog(JFrame frame) {

super(frame, true);

setTitle("Help");

contentPane.setLayout(new GridBagLayout());

contentPane.setBackground(Color.LIGHT_GRAY);

contentPane.setBorder(BorderFactory.createTitledBorder(

BorderFactory.createEmptyBorder(),

"Follow this instructions", 1, 1,

new Font("Serif", Font.ITALIC, 14),

Color.WHITE));

constrain(contentPane, infoTextArea, 0, 1, 1, 1,

GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 1.0,

1.0, 0, 0, 0, 2);

constrain(contentPane, buttonOK, 0, 2, 2, 2, GridBagConstraints.CENTER,

GridBagConstraints.CENTER, 1.0, 1.0, 0, 0, 0, 3);

setContentPane(contentPane);

getRootPane().setDefaultButton(buttonOK);

buttonOK.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

onOK();

}

});

pack();

setLocationRelativeTo(frame);

setVisible(true);

}

public void constrain(Container container, Component component, int grid_x,

int grid_y, int grid_width, int grid_height, int fill, int anchor,

double weight_x, double weight_y, int top, int left, int bottom,

int right) {

GridBagConstraints c = new GridBagConstraints();

c.gridx = grid_x;

c.gridy = grid_y;

c.gridwidth = grid_width;

c.gridheight = grid_height;

c.fill = fill;

c.anchor = anchor;

c.weightx = weight_x;

c.weighty = weight_y;

if (top + bottom + left + right > 0)

c.insets = new Insets(top, left, bottom, right);

((GridBagLayout) container.getLayout()).setConstraints(component, c);

container.add(component);

}

private void onOK() {

dispose();

}

}

DiffValues

package ua.kpi.rungekutt;

import java.util.Arrays;

/**

* Describes all main properties of differential equation, also can incaprulate

* result of Koshi task

*/

public class DiffValues {

/**

* needed interval low limit

*/

double a;

/**

* needed interval high limit

*/

double b;

/**

* needed number of iterations

*/

int n;

/**

* realising function y'(x)=g(x,y)

*/

ScriptedF g;

/**

* realising function y''(x)=g(x,y,z)

*/

ScriptedF2 f;

/**

* value of y'(x0), parameter of the Koshi task

*/

double ypohx0;

/**

* value of y(x0), parameter of the Koshi task

*/

double yx0;

/**

* value of x0, parameter of the Koshi task

*/

double x0;

/**

* Results: x

*/

double[] xi;

/**

* Results: y(x)

*/

double[] yi;

/**

* Results: y'(x)

*/

double[] ypohi;

/**

* Constructs the differential equation with no solution, only information

*

* @param a Low-limit

* @param b High-limit

* @param n Number of steps

* @param g Function y'(x)=g(x,y)

* @param yx0 value of y(x0), parameter of the Koshi task

* @param x0 value of x0, parameter of the Koshi task

*/

public DiffValues(double a, double b, int n, ScriptedF g, double x0,

double yx0) {

this.a = a;

this.b = b;

this.n = n;

this.g = g;

this.x0 = x0;

this.yx0 = yx0;

}

/**

*

* Constructs the differential equation with solution

*

* @param a Low-limit

* @param b High-limit

* @param n Number of steps

* @param g Function y'(x)=g(x,y)

* @param yx0 value of y(x0), parameter of the Koshi task

* @param x0 value of x0, parameter of the Koshi task

* @param xi Solution : x

* @param yi Solution : y(x)

*/

public DiffValues(double a, double b, int n, ScriptedF g, double x0, double yx0,

double[] xi, double[] yi) {

this.a = a;

this.b = b;

this.n = n;

this.g = g;

this.x0 = x0;

this.yx0 = yx0;

this.xi = xi;

this.yi = yi;

}

/**

*

* Constructs the differential( y''=f(x,y,y')) equation with solution

*

* @param a Low-limit

* @param b High-limit

* @param n Number of steps

* @param g Function y''(x)=g(x,y,z), where z = y'

* @param yx0 value of y(x0), parameter of the Koshi task

* @param x0 value of x0, parameter of the Koshi task

* @param xi Solution : x

* @param yi Solution : y(x)

*/

public DiffValues(double a, double b, int n, ScriptedF2 f, double x0,double yx0, double ypohx0) {

this.a = a;

this.b = b;

this.n = n;

this.f = f;

this.x0 = x0;

this.yx0 = yx0;

this.ypohx0 = ypohx0;

}

/**

*

* Constructs the differential( y''=f(x,y,y')) equation with solution

*

* @param a Low-limit

* @param b High-limit

* @param n Number of steps

* @param g Function y''(x)=g(x,y,z), where z = y'

* @param yx0 value of y(x0), parameter of the Koshi task

* @param x0 value of x0, parameter of the Koshi task

* @param xi Solution : x

* @param yi Solution : y(x)

*/

public DiffValues(double a, double b, int n, ScriptedF2 g, double x0,double yx0, double ypohx0,

double[] xi, double[] yi, double[] ypohi) {

this.a = a;

this.b = b;

this.n = n;

this.f = f;

this.x0 = x0;

this.yx0 = yx0;

this.ypohx0 = ypohx0;

this.xi = xi;

this.yi = yi;

this.ypohi = ypohi;

}

/**

* @return the a

*/

public double getA() {

return a;

}

/**

* @return the b

*/

public double getB() {

return b;

}

/**

* @return the n

*/

public int getN() {

return n;

}

/**

* @return the g

*/

public ScriptedF getG() {

return g;

}

/**

* @return the x0

*/

public double getX0() {

return x0;

}

/**

* @return the y(x0)

*/

public double getYX0() {

return yx0;

}

/**

* @return the y'(x0)

*/

public double getYPohX0() {

return ypohx0;

}

/**

* @return the xi

*/

public double[] getXi() {

return xi;

}

/**

* @return the yi

*/

public double[] getYi() {

return yi;

}

/**

* @return the y'i

*/

public double[] getYPohi() {

return ypohi;

}

/**

* @param a

* the a to set

*/

public void setA(double a) {

this.a = a;

}

/**

* @param b

* the b to set

*/

public void setB(double b) {

this.b = b;

}

/**

* @param n

* the n to set

*/

public void setN(int n) {

this.n = n;

}

/**

* @param g

* the g to set

*/

public void setG(ScriptedF g) {

this.g = g;

}

/**

* @param x0

* the x0 to set

*/

public void setX0(double x0) {

this.x0 = x0;

}

/**

* @param x0

* the x0 to set

*/

public void setYX0(double yx0) {

this.yx0 = yx0;

}

/**

* @param xi

* the xi to set

*/

public void setXi(double[] xi) {

this.xi = xi;

}

/**

* @param yi

* the yi to set

*/

public void setYi(double[] yi) {

this.yi = yi;

}

/**

* @param y'i

* the y'i to set

*/

public void setYpohi(double[] ypohi) {

this.ypohi = ypohi;

}

/**

* @return the f

*/

public ScriptedF2 getF() {

return f;

}41

/**

* @param f the f to set

*/

public void setF(ScriptedF2 f) {

this.f = f;

}

}

MainMethod

package ua.kpi.rungekutt;

import java.util.ArrayList;

import ua.kpi.rungekutt.*;

/**

*/

public class MainMethod {

/**

* Forms the values of y(x) from a to b, due to y(x0)=yx0

*

* @param a

* Low-limit

* @param b

* High-limit

* @param n

* Number of steps

* @param g

* Function in the right side of equation y'(t) = g(x,y)

* @param x0

* Due to Kochi problem value og y(x0)

* @return Instance of DiffValues, that encapsulates set table of y due

* to x

*/

public static DiffValues action(double a, double b, int n, ScriptedF g,

double t0, double x0) {

// -- Names are retained from the book

// --gettins step of perfoming

double step = ((double) (b - a)) / n;

// --forming ti array from t0 to b with step 'step'

double[] t = new double[n];

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

t[i] = a + i * step;

}

// --forming first 4 values of function due to argument

double[] xi = new double[n + 1];

/*

* Making iteration to achive a from x0, to learn y(a)

*/

xi[0] = getYofA(t0, a, step, g, x0);

/*

* Starts back to standart algorythm

*/

double[] K = new double[4];

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

K[0] = g.evaluate(t[i - 1], xi[i - 1]);

K[1] = g.evaluate(t[i - 1] + step / 2, xi[i - 1] + step * K[0] / 2);

K[2] = g.evaluate(t[i - 1] + step / 2, xi[i - 1] + step * K[1] / 2);

K[3] = g.evaluate(t[i - 1] + step, xi[i - 1] + step * K[2]);

xi[i] += (step / 6) * (K[0] + 2 * K[1] + 2 * K[2] + K[3]);

}

// -- forming last values

/*

* reruns all diff information with initialized values of y(x)

*/

return new DiffValues(a, b, n, g, t0, x0, t, xi);

}

/**

* Forms the values of y(x) from a to b, due to y(x0)=yx0

*

* @param a

* Low-limit

* @param b

* High-limit

* @param n

* Number of steps

* @param g

* Function in the right side of equation y'(t) = g(x,y)

* @param x0

* Due to Kochi problem value og y(x0)

* @return Instance of DiffValues, that encapsulates setted table od y due

* to x

*/

public static DiffValues action2(double a, double b, int n, ScriptedF2 g,

double x0, double yx0, double yx0poh) {

// -- Names are retained from the book

//--function to describe y'(x0)

ScriptedF2 f = new ScriptedF2("z");

// --gettins step of perfoming

double step = ((double) (b - a)) / n;

// --forming xi array from a to b with step

double[] xi = new double[n];

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

xi[i] = a + i * step;

}

double[] yi = new double[n + 1];

double[] ypohi = new double[n + 1];

/*

* settle y(x0) and y'(x0) values

*/

yi[0] = yx0;

ypohi[0] = yx0poh;

double[] K = new double[n + 4];

double[] L = new double[n + 4];

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

K[i - 1] = g.evaluate(xi[i - 1], yi[i - 1], ypohi[i - 1]);

L[i - 1] = f.evaluate(xi[i - 1], yi[i - 1], ypohi[i - 1]);

K[i] = g.evaluate(xi[i - 1] + step / 2, yi[i - 1] + step * K[0] / 2, ypohi[i - 1] + (K[i - 1] / 2));

L[i] = f.evaluate(xi[i - 1] + step / 2, yi[i - 1] + step * K[0] / 2, ypohi[i - 1] + (K[i - 1] / 2));

K[i + 1] = g.evaluate(xi[i - 1] + step / 2, yi[i - 1] + step * K[1] / 2, ypohi[i - 1] + (L[i] / 2));

L[i + 1] = f.evaluate(xi[i - 1] + step / 2, yi[i - 1] + step * K[1] / 2, ypohi[i - 1] + (L[i] / 2));

K[i + 2] = g.evaluate(xi[i - 1] + step, yi[i - 1] + step * K[2], ypohi[i - 1] + L[i + 1]);

L[i + 2] = f.evaluate(xi[i - 1] + step, yi[i - 1] + step * K[2], ypohi[i - 1] + L[i + 1]);

yi[i] += (step / 6) * (K[i - 1] + 2 * K[i] + 2 * K[i + 1] + K[i + 2]);

ypohi[i] += (K[i - 1] + 2 * (K[i] + K[i + 1]) + K[i + 2]) / 6;

}

/*

* reruns all diff information with initialized values of y(x)

*/

return new DiffValues(a, b, n, g, xi[0], yi[0], ypohi[0], xi, yi, ypohi);

}

/**

* Makes iterations to achive a from x0 and learn y(a)

*

* @param a

* start, this should be known x0 parameter

* @param b

* achive, nearby a from main algorytm of adams computation

* @param step

* how closely should we look

* @param g

* function given by user

* @param x0

* y-starting point, known y(x0)

* @return Value y(a) or nearest to it, y(a-step)

*/

private static double getYofA(double a, double b, double step, ScriptedF g,

double x0) {

// --how many steps should we make to achive from x0 to a

int n = (int) ((b - a) / step);

// -- if a=x0 then y(a)=y(x0), so we can return y(x0)

if (n == 0) {

return x0;

}

// --forming ti array

double[] t = new double[n];

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

t[i] = a + i * step;

}

// --forming first 4 values of function due to argument

double[] xi = new double[n + 1];

xi[0] = x0;

double[] K = new double[4];

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

K[0] = g.evaluate(t[i - 1], xi[i - 1]);

K[1] = g.evaluate(t[i - 1] + step / 2, xi[i - 1] + step * K[0] / 2);

K[2] = g.evaluate(t[i - 1] + step / 2, xi[i - 1] + step * K[1] / 2);

K[3] = g.evaluate(t[i - 1] + step, xi[i - 1] + step * K[2]);

xi[i] += (step / 6) * (K[0] + 2 * K[1] + 2 * K[2] + K[3]);

}

// -- forming last values

double xp;

for (int i = 3; i < n - 1; i++) {

xp = xi[i]

+ step

/ 24

* (-9 * g.evaluate(t[i - 3], xi[i - 3]) + 37

* g.evaluate(t[i - 2], xi[i - 2]) - 59

* g.evaluate(t[i - 1], xi[i - 1]) + 55 * g.evaluate(t[i], xi[i]));

xi[i + 1] = xi[i]

+ (step / 24)

* (g.evaluate(t[i - 2], xi[i - 2]) - 5

* g.evaluate(t[i - 1], xi[i - 1]) + 19

* g.evaluate(t[i], xi[i]) + 9 * g.evaluate(t[i], xp));

}

// -- y(a)

return xi[n - 1];

}

}

ScriptedF

package ua.kpi.rungekutt;

import javax.script.*;

import javax.swing.JDialog;

import javax.swing.JOptionPane;

/**

* Everything to parse and evaluate function

*/

public class ScriptedF {

/**

* Name of engine we create to perform with scripts

*/

ScriptEngine engine;

/**

* Engine we use to perform

*/

Invocable invocableEngine;

/**

* Library is needed to shorten the form from Math.sin to sin

*/

final static String LIBRARYSIN = "function sin(x){" + "return Math.sin(x);"

+ "}";

/**

* Library is needed to shorten the form from Math.cos to cos

*/

final static String LIBRARYCOS = "function cos(x){" + "return Math.cos(x);"

+ "}";

/**

* Library is needed to shorten the form from Math.tan to tan

*/

final static String LIBRARYTAN = "function tan(x){" + "return Math.tan(x);"

+ "}";

/**

* Library is needed to shorten the form from Math.pow(x,2) to sqr

*/

final static String LIBRARYSQR = "function sqr(x){" + "return Math.pow(x,2);"

+ "}";

/**

* Library is needed to shorten the form from Math.sqrt to sqrt

*/

final static String LIBRARYSQRT = "function sqrt(x){" + "return Math.sqrt(x);"

+ "}";

/**

* Library is needed to shorten the form from Math.pow(x,y) to pow(x,y)

*/

final static String LIBRARYPOW = "function pow(x,y){"

+ "return Math.pow(x,y);" + "}";

final static String CODE_PREFIX = "" + "function func(x, y){"

+ " return ";

final static String CODE_SUFFIX = ";" + "}";

/**

* Code achived

*/

private String code;

/**

* Constructs by code the function by javascript engine

* @param code

*/

public ScriptedF(String code) {

this.code = code;//-- function saves its code

ScriptEngineManager manager = new ScriptEngineManager();

engine = manager.getEngineByName("javascript");//--can be another

try {

//-- here we evaluate some expressions as we want

engine.eval(LIBRARYSIN);

engine.eval(LIBRARYCOS);

engine.eval(LIBRARYTAN);

engine.eval(LIBRARYPOW);

engine.eval(LIBRARYSQR);

engine.eval(LIBRARYSQRT);

engine.eval(CODE_PREFIX + code + CODE_SUFFIX);

} catch (Exception e) {

throw new IllegalArgumentException();

}

//--makes specified engine invoked

invocableEngine = (Invocable) engine;

}

/**

* evaluates function for given x and y

* @param x Parameter x

* @param y Parameter y

* @return Function result, function compiles with engine invoked

*/

public double evaluate(double x, double y) {

try {

//-- invokes function, now it can be used

return (Double) invocableEngine.invokeFunction("func", x, y);

} catch (ScriptException e) {

throw new IllegalArgumentException();

} catch (NoSuchMethodException e) {

throw new IllegalArgumentException();

}

}

@Override

public String toString() {

return "y'(x) = "+code;

}

}

ScriptedF2

package ua.kpi.rungekutt;

import javax.script.*;

import javax.swing.JDialog;

import javax.swing.JOptionPane;

/**

* Everything to parse and evaluate function

*/

public class ScriptedF2 {

/**

* Name of engine we create to perform with scripts

*/

ScriptEngine engine;

/**

* Engine we use to perform

*/

Invocable invocableEngine;

/**

* Library is needed to shorten the form from Math.sin to sin

*/

final static String LIBRARYSIN = "function sin(x){" + "return Math.sin(x);"

+ "}";

/**

* Library is needed to shorten the form from Math.cos to cos

*/

final static String LIBRARYCOS = "function cos(x){" + "return Math.cos(x);"

+ "}";

/**

* Library is needed to shorten the form from Math.tan to tan

*/

final static String LIBRARYTAN = "function tan(x){" + "return Math.tan(x);"

+ "}";

/**

* Library is needed to shorten the form from Math.pow(x,y) to pow(x,y)

*/

final static String LIBRARYPOW = "function pow(x,y){"

+ "return Math.pow(x,y);" + "}";

/**

* Library is needed to shorten the form from Math.pow(x,2) to sqr

*/

final static String LIBRARYSQR = "function sqr(x){" + "return Math.pow(x,2);"

+ "}";

/**

* Library is needed to shorten the form from Math.sqrt to sqrt

*/

final static String LIBRARYSQRT = "function sqrt(x){" + "return Math.sqrt(x);"

+ "}";

final static String CODE_PREFIX = "" + "function func(x, y, z){"

+ " return ";

final static String CODE_SUFFIX = ";" + "}";

/**

* Code achived

*/

private String code;

/**

* Constructs by code the function by javascript engine

* @param code

*/

public ScriptedF2(String code) {

this.code = code;//-- function saves its code

ScriptEngineManager manager = new ScriptEngineManager();

engine = manager.getEngineByName("javascript");//--can be another

try {

//-- here we evaluate some expressions as we want

engine.eval(LIBRARYSIN);

engine.eval(LIBRARYCOS);

engine.eval(LIBRARYTAN);

engine.eval(LIBRARYPOW);

engine.eval(LIBRARYSQR);

engine.eval(LIBRARYSQRT);

engine.eval(CODE_PREFIX + code + CODE_SUFFIX);

} catch (Exception e) {

throw new IllegalArgumentException();

}

//--makes specified engine invoked

invocableEngine = (Invocable) engine;

}

/**

* evaluates function for given x and y and z

* @param x Parameter x

* @param y Parameter y

* @param z Parameter y'

* @return Function result, function compiles with engine invoked

*/

public double evaluate(double x, double y, double z) {

try {

//-- invokes function, now it can be used

return (Double) invocableEngine.invokeFunction("func", x, y, z);

} catch (ScriptException e) {

throw new IllegalArgumentException();

} catch (NoSuchMethodException e) {

throw new IllegalArgumentException();

}

}

@Override

public String toString() {

return "y''(x) = "+code;

}

}

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


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

  • Решение системы обыкновенных дифференциальных уравнений в программе Matlab. Применение метода Рунге–Кутты. Априорный выбор шага интегрирования. Построение трехмерного графика движения точки в декартовой системе координат и создание видеофайла формата AVI.

    контрольная работа [602,8 K], добавлен 04.05.2015

  • Опытное исследование свойств методов Рунге-Кутты. Реализация численных методов приближенного интегрирования обыкновенных дифференциальных уравнений, наиболее часто применяющихся в практике моделирования и проектирования систем автоматизации и управления.

    курсовая работа [311,5 K], добавлен 05.03.2009

  • Обыкновенное дифференциальное уравнение первого порядка. Задача Коши, суть метода Рунге-Кутта. Выбор среды разработки. Программная реализация метода Рунге-Кутта 4-го порядка. Определение порядка точности метода. Применение языка программирования C++.

    курсовая работа [163,4 K], добавлен 16.05.2016

  • Решение дифференциальных уравнений с использованием классических алгоритмов численных методов Эйлера и Рунге-Кутта 4-го порядка. Команды, используемые при решении обыкновенных дифференциальных уравнений в системе вычислений. Результат работы программы.

    курсовая работа [226,6 K], добавлен 05.04.2013

  • Численные методы решения задачи Коши для обыкновенных дифференциальных уравнений: Эйлера, Рунге-Кутта, Адамса и Рунге. Техники приближенного решения данных уравнений: метод конечных разностей, разностной прогонки, коллокаций; анализ результатов.

    курсовая работа [532,9 K], добавлен 14.01.2014

  • Разработка программы на языке Turbo Pascal 7.0 для преобразования кинетической схемы протекания химических реакций при изотермических условиях в систему дифференциальных уравнений. Ее решение в численном виде методом Рунге-Кутта четвертого порядка.

    курсовая работа [929,7 K], добавлен 06.01.2013

  • Анализ предметной области объектно-ориентированного программирования. Языки Delphi, Object Pascal - объектно-ориентированная среда программирования. Основные алгоритмические решения. Решение дифференциального уравнения методом Рунге-Кутта в среде Excel.

    курсовая работа [1,5 M], добавлен 02.04.2011

  • Математическая модель, описание теории, применяемой к задаче. Обсчет точек методом Рунге-Кутта, модифицированным методом Эйлера, схема и листинг программы. Решение дифференциальных уравнений и построение графиков, решение уравнений в среде Turbo Pascal.

    курсовая работа [76,7 K], добавлен 18.11.2009

  • Численный метод для решения однородного дифференциального уравнения первого порядка методом Эйлера. Решение систем дифференциальных уравнений методом Рунге–Кутта. Решение краевой задачи. Уравнения параболического типа, а также Лапласа и Пуассона.

    курсовая работа [163,5 K], добавлен 27.05.2013

  • Обзор методов решения в Excel. Рекурентные формулы метода Эйлера. Метод Рунге-Кутта четвертого порядка для решения уравнения первого порядка. Метод Эйлера с шагом h/2. Решение дифференциальных уравнений с помощью Mathcad. Модифицированный метод Эйлера.

    курсовая работа [580,1 K], добавлен 18.01.2011

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