Численное моделирование ситуации blow-up для нелинейных дифференциальных уравнений
Описание физических явлений нелинейными уравнениями и неравенствами с сингулярными коэффициентами. Условия возникновения ситуации blow-up для нелинейных дифференциальных неравенств. Постановка задачи и алгоритм ее решения, код программы на языке C#.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 15.10.2016 |
Размер файла | 2,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Федеральное государственное бюджетное образовательное учреждение высшего образования
"Московский государственный технологический университет "СТАНКИН"
Отчет по лабораторной работе на тему:
"Численное моделирование ситуации blow-up для нелинейных дифференциальных уравнений"
Выполнил:
студент группы ИДБ-13-09
Котельникова А.
Москва 2016
Содержание
- 1. Постановка задачи и алгоритм ее решения
- 2. Код программы (на языке C#)
- 3. Результат работы программы для h=0.25
- 4. Результат работы программы для h=0.05
- 5. Результат работы программы для h=0.0025
- 6. Сравнение метода Эйлера и метода Рунге-Кутты четвертого порядка
- 7. Порядок фактической погрешности времени жизни решения относительно шага h по сетке времени
- Заключение
- Список литературы
- 1. Постановка задачи и алгоритм ее решения
Точное решение представленного дифференциального уравнения:
Ситуация blow-up имеет место при времени blow-up
.
Найдем приближенное время жизни и приближенное решение этой же задачи Коши при помощи метода Эйлера. Фактически использование этого метода заключается в итерационном подсчете значений до тех пор, пока новое значение не превзойдет некого наперед заданного числа M. Время жизни в таком случае будет равно
.
Производить подсчет значений будем по формуле:
Где по условию, а шаг по сетке времени.
Теоретическую оценку погрешности времени жизни приближенного решения для метода Эйлера найдем по формуле
(данная формула взята из [1]). По условию задачи , поэтому формула выше принимает вид
Фактическую погрешность времени жизни приближенного решения найдем как разность между времени жизни приближенного решения, полученного при приближенном решении задачи методом Эйлера, и временем жизни точного решения. Также на каждом шаге будем считать разницу между точным и приближенным решением для данного значения t.
2. Код программы (на языке C#)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace salieva
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void chart1_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
chart1.Series["Приближенное"].Points.Clear();
chart1.Series["Точное"].Points.Clear();
dataSet1.Tables[0].Rows.Clear();
double m, y, h, y_chast, t;
int n;
if (!double.TryParse(textBox1.Text,out m))
{
MessageBox.Show("Неверно введено M");
return;
}
h = Convert.ToDouble(comboBox1.SelectedItem.ToString());
y = 0.3;
n = 0;
do
{
t = n * h;
y_chast = Math.Sqrt(1.0 / (2.0 * (50.0 / 9.0 - t)));
if (double.IsNaN(y_chast))
{
y_chast = 0;
}
else
{
if (y_chast < m)
{
chart1.Series["Приближенное"].Points.Add(new System.Windows.Forms.DataVisualization.Charting.DataPoint(t, y_chast));
}
}
if (y < m)
{
chart1.Series["Точное"].Points.Add(new System.Windows.Forms.DataVisualization.Charting.DataPoint(t, y));
}
dataSet1.Tables[0].Rows.Add(t, y, y_chast, y-y_chast);
y = y + Math.Pow(y, 3) * h;
n++;
} while (y < m);
t = n * h;
y_chast = Math.Sqrt(1.0 / (2.0 * (50.0 / 9.0 - t)));
if (double.IsNaN(y_chast))
{
y_chast = 0;
}
else
{
chart1.Series["Приближеное"].Points.Add(new System.Windows.Forms.DataVisualization.Charting.DataPoint(t, y_chast));
}
chart1.Series["Точное"].Points.Add(new System.Windows.Forms.DataVisualization.Charting.DataPoint(t, y));
dataSet1.Tables[0].Rows.Add(t, y, y_chast, y - y_chast);
label4.Text = n.ToString();
solveRungeKutta();
}
private double getF(double x)
{
return x * x * x;
}
private void solveRungeKutta()
{
listBox1.Items.Clear();
listBox2.Items.Clear();
double m;
if (!double.TryParse(textBox1.Text, out m))
{
MessageBox.Show("Неверно введено M");
return;
}
double h = Convert.ToDouble(comboBox1.SelectedItem.ToString());
chart1.Series["Метод Рунге-Кутты"].Points.Clear();
double y = 0.3;
double t = 0.0;
int n = 0;
do
{
if (!double.IsNaN(y))
{
chart1.Series["Метод Рунге-Кутты"].Points.Add(new System.Windows.Forms.DataVisualization.Charting.DataPoint(t, y));
}
listBox1.Items.Add(String.Format("t={0}, y={1}", t, y));
if (dataSet1.Tables[0].Rows.Count > n)
{
listBox2.Items.Add((double)dataSet1.Tables[0].Rows[n][1] - y);
}
y = calcNextStep(t, h, y);
t += h;
n++;
} while (y < m);
/*if (!double.IsNaN(y))
{
chart1.Series["Метод Рунге-Кутты"].Points.Add(new System.Windows.Forms.DataVisualization.Charting.DataPoint(t, y));
}*/
listBox1.Items.Add(y.ToString());
if (dataSet1.Tables[0].Rows.Count > n)
{
listBox2.Items.Add((double)dataSet1.Tables[0].Rows[n][1] - y);
}
label6.Text = n.ToString();
}
private double calcNextStep(double t, double h, double y)
{
double k1 = getF(y);
double k2 = getF(y + (h / 2.0) * k1);
double k3 = getF(y + (h / 2.0) * k2);
double k4 = getF(y + h * k3);
y += (h / 6.0) * (k1 + 2.0 * k2 + 2.0 * k3 + k4);
return y;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.SelectedItem = comboBox1.Items[0];
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void label3_Click(object sender, EventArgs e)
{
}
private void label4_Click(object sender, EventArgs e)
{
}
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}
3. Результат работы программы для h=0.25
нелинейный дифференциальный уравнение алгоритм
На графике красная линия - точное решение, черная линия - приближенное решение.
Таким образом, программе понадобилось 27 итераций для получения приближенного времени жизни. Видно, что приближенное решение "опережает" по сравнению с точным. Также разница между точным и приближенным решениями до какого-то момента времени оказывается достаточно незначительной (линии на графике практически накладываются друг на друга), но при приближении к ситуации blow-up разность между ними начинает резко возрастать (красная линия отделяется от черной).
Оценка погрешности равна -1,98361481316321
4. Результат работы программы для h=0.05
На графике красная линия - точное решение, черная линия - приближенное решение.
Программе понадобилось несколько больше итераций, но не на порядок, для получения приближенного времени жизни. По сравнению с графиком для h=0.05 кривые гораздо меньше отстают друг от друга, что говорит о том, что приближенное решение гораздо точнее оценивает точное. Из этого делаем достаточно логичный вывод о том, что уменьшение шага h по времени положительно сказывается на точности алгоритма.
Приближенное время жизни равно 6,5, а точное равно 5.555556, т.е. фактическая погрешность времени жизни равна 0.4, в то время как теоретическая оценка погрешности времени жизни равна 0.3443878 .
5. Результат работы программы для h=0.0025
На графике красная линия - точное решение, черная линия - приближенное решение.
Программе понадобилось 230 итераций для получения приближенного времени жизни. Кривые еще меньше отстают друг от друга, то есть оценка стала еще точнее. С другой стороны, количество итераций тоже резко возросло.
Приближенное время жизни равно 5,565, а точное равно 5.55556, т.е. фактическая погрешность времени жизни равна 0.01, в то время как теоретическая оценка погрешности времени жизни равна 0.01626939 .
Мы исследовали зависимость от М для всех h.
Подводя промежуточный итог на данном этапе, можно сделать вывод, что для моделирования ситуации М blow-up нам не стоит брать слишком большую верхнюю границу, поскольку будем наблюдать слишком огромный скачок на последней итерации. Напротив, если брать слишком маленькое М ситуация blow-up нами не смоделируется.
6. Сравнение метода Эйлера и метода Рунге-Кутты четвертого порядка
Хоть теоретическая оценка погрешности времени жизни для метода Рунге-Кутты нам неизвестна, мы все равно можем сравнить эффективность этих методов по фактической погрешности и по количеству итераций, необходимых для получения приближенного времени жизни.
Метод Рунге-Кутты четвертого порядка имеет четвертый порядок точности. Это значит, что ошибка на одном шаге имеет порядок , а суммарная ошибка на конечном интервале имеет порядок . Для :
,
,
Метод |
h=0.25 |
h=0.05 |
h=0.0025 |
||
Эйлера |
? |
1.5 |
0.4 |
0.01 |
|
Итераций |
26 |
116 |
2226 |
||
Рунге-Кутты |
? |
0.22 |
0.04 |
10-8 |
|
Итераций |
23 |
112 |
2221 |
Как по фактической погрешности времени жизни решения, так и по количеству итераций метод Рунге-Кутты оказывается точнее. Но хоть количество итераций для метода Рунге-Кутты меньше (причем меньше весьма незначительно), количество операций оказывается значительно больше, т.к. в цикле для вычисления нового значения методом Эйлера выполняется одна операция, а методом Рунге-Кутты - пять операций.
Для современной вычислительной техники такое количество операций не является большой проблемой, поэтому в целом стоит признать метод Рунге-Кутты более эффективным для априорного оценивания времени жизни решения.
7. Порядок фактической погрешности времени жизни решения относительно шага h по сетке времени
Попытаемся оценить порядок x в уравнении
Составим пропорцию:
;
;
;
;
log(1.5/0.4)/log(0.25/0.05)=0.8212531
log(0.4/0.0225)/log(0.05/0.0025)=0.9606831
log(1.5/0.0225)/log(0.25/0.0025)=0.9119544
log(0.004/1.5)/log(0.0005/0.25)=0.9537087
Посчитав х для нескольких значений из таблицы выше, получаем близкие к 1 значения, что соответствует порядку метода Эйлера.
Заключение
Далеко не всегда для дифференциального уравнения можно получить точное решение и точное время жизни данного решения. В таких случаях приходится прибегать к численным методам для поиска приближенного решения поставленной задачи. Данная работа позволяет нам понять, насколько эффективно численные методы могут оценивать как само решение уравнения, так и время жизни решения, а также выявить зависимость точности приближения от шага сетки (h) по времени и от момента остановки работы итерационного цикла (M).
Приближенное решение оказывается весьма точной оценкой точного решения до того момента по времени, пока мы не оказываемся вблизи , вблизи же оно уже достаточно сильно отличается от точного решения. Величина h, как и ожидалось, напрямую влияет на точность получаемой оценки времени жизни решения: чем меньше h, тем ближе оценка к реальному значению. Ситуация с M не такая однозначная: с одной стороны, маленькое значение M не даст смоделировать ситуацию blow-up, с другой стороны, для больших значений M и погрешность оценки времени жизни решения оказывается больше, так как решения успевают "разойтись" дальше друг от друга. Для реального прогнозирования ситуаций blow-up стоит брать большое значение M, теряя в точности оценки. Сделать оценку более точной поможет меньшее значение h.
При сравнении метода Эйлера и метода Рунге-Кутты гораздо лучше показал себя метод Рунге-Кутты. Количество операций в нем оказывается больше, но зато погрешность времени жизни решений становится значительно меньше, что является более важным критерием при выборе метода. Полученные фактические значения погрешности времени жизни в целом совпадают с теоретическими, что можно считать подтверждением работоспособности программы.
Список литературы
1. Chiaki Hirota, Kazufumi Ozawa. Numerical method of estimating the blow-up time and rate of the solution of ordinary differential equations--An application to the blow-up problems of partial differential equations. Akita Prefectural University, 2004.
Размещено на Allbest.ru
...Подобные документы
Численные методы решения нелинейных уравнений, систем линейных и нелинейных алгебраических уравнений, дифференциальных уравнений, определенных интегралов. Методы аппроксимации дискретных функций и методы решения задач линейного программирования.
методичка [185,7 K], добавлен 18.12.2014Исследование свойств и поведения динамических объектов, описываемых системами обыкновенных нелинейных дифференциальных уравнений. Описание методов, программ и алгоритмов решения систем линейных и нелинейных алгебраических уравнений в системе MathCAD.
контрольная работа [255,1 K], добавлен 16.01.2009Обзор существующих методов по решению нелинейных уравнений. Решение нелинейных уравнений комбинированным методом и методом хорд на конкретных примерах. Разработка программы для решения нелинейных уравнений, блок-схемы алгоритма и листинг программы.
курсовая работа [435,8 K], добавлен 15.06.2013Основные этапы математического моделирования. Метод Эйлера как наиболее простой численный метод решения обыкновенных дифференциальных уравнений. Написание компьютерной программы, которая позволит изучать графики системы дифференциальных уравнений.
курсовая работа [1,9 M], добавлен 05.01.2013Расчет трансформатора питания. Численное решение нелинейных уравнений с заданной точностью и дифференциальных уравнений первого порядка. Разработка программы с использованием средств визуального программирования на алгоритмическом языке программирования.
курсовая работа [1,2 M], добавлен 17.08.2013Решение нелинейных уравнений методом простых итераций и аналитическим, простым и модифицированным методом Ньютона. Программы на языке программирования Паскаль и С для вычислений по вариантам в порядке указанных методов. Изменение параметров задачи.
лабораторная работа [191,0 K], добавлен 24.06.2008Сравнительный анализ итерационных методов решения нелинейных алгебраических и трансцендентных уравнений. Простейший алгоритм отделения корней нелинейных уравнений. Метод половинного деления. Геометрический смысл метода Ньютона. Метод простой итерации.
реферат [95,0 K], добавлен 06.03.2011Схема и основные параметры элементов цепи. Вывод системы дифференциальных уравнений. Реализация алгоритма на языке программирования высокого уровня Pascal. Решение дифференциальных уравнений в пакете MathCAD. Решение интерполяции в пакете Excel.
курсовая работа [375,4 K], добавлен 06.01.2011Метод половинного деления как один из методов решения нелинейных уравнений, его основа на последовательном сужении интервала, содержащего единственный корень уравнения. Алгоритм решения задачи. Описание программы, структура входных и выходных данных.
лабораторная работа [454,1 K], добавлен 09.11.2012Разработка программы на языке Turbo Pascal 7.0 для преобразования кинетической схемы протекания химических реакций при изотермических условиях в систему дифференциальных уравнений. Ее решение в численном виде методом Рунге-Кутта четвертого порядка.
курсовая работа [929,7 K], добавлен 06.01.2013Суть основных идей и методов, особенностей и областей применения программирования для численных методов и решения нелинейных уравнений. Методы итераций, дихотомии и хорд и их использование. Алгоритм метода Ньютона, создание программы и ее тестирование.
курсовая работа [423,0 K], добавлен 17.02.2010Особенности решения уравнений с одной переменной методом половинного деления. Оценка погрешности метода простой итерации. Суть решения уравнений в пакете Mathcad. Векторная запись нелинейных систем. Метод Ньютона решения систем нелинейных уравнений.
курсовая работа [2,1 M], добавлен 12.12.2013Разработка быстрого и эффективного алгоритма для решения задачи оценки параметров обыкновенных дифференциальных уравнений с запаздывающими аргументами, не разрешаемых аналитически. Реализация алгоритма в виде библиотеки на языке программирования MATLAB.
дипломная работа [1,6 M], добавлен 19.06.2012Вывод системы дифференциальных уравнений. Описание методов численного решения задачи Коши. Моделирование переходных процессов в электрической цепи. Решение задачи аппроксимации. Расчет количества теплоты, выделившейся на резисторе, реализация в MathCAD.
курсовая работа [202,5 K], добавлен 11.11.2013Математическая постановка задачи. Алгоритм решения системы обыкновенных дифференциальных уравнений методом Эйлера. Параметры программы, ее логическая структура и функциональное назначение. Анализ входных и выходных данных. Описание тестовых задач.
курсовая работа [38,0 K], добавлен 26.04.2011Особенности точных и итерационных методов решения нелинейных уравнений. Последовательность процесса нахождения корня уравнения. Разработка программы для проверки решения нелинейных функций с помощью метода дихотомии (половинного деления) и метода хорд.
курсовая работа [539,2 K], добавлен 15.06.2013Решение дифференциальных уравнений с использованием классических алгоритмов численных методов Эйлера и Рунге-Кутта 4-го порядка. Команды, используемые при решении обыкновенных дифференциальных уравнений в системе вычислений. Результат работы программы.
курсовая работа [226,6 K], добавлен 05.04.2013Изучение методов решения нелинейных уравнений таких как: метод Ньютона, модифицированный метод Ньютона, метод Хорд, метод простых Итераций. Реализация программы для персонального компьютера, которая находит решение нелинейного уравнения разными способами.
практическая работа [321,9 K], добавлен 24.06.2012Программирование нестандартных функций. Матрицы и операции над ними. Решение нелинейных уравнений и численное интегрирование. Оптимизация функции и численное дифференцирование. Аппроксимация функции: методы решения, описание программы, результаты.
курсовая работа [70,5 K], добавлен 12.08.2011Суть метода Рунге-Кутта и его свойства. Решение дифференциальных уравнений первого порядка. Вычислительный блок Given/Odesolve. Встроенные функции rkfixed, Rkadapt, Bulstoer. Решения линейных алгебраических уравнений в среде MathCad и Microsoft Excel.
курсовая работа [1,1 M], добавлен 02.06.2014