Файл: Цель работы Освоить программную реализацию имитационной модели нелинейной динамической системы. Исходные данные.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 98
Скачиваний: 6
-
Цель работы
-
Исходные данные
-
Задачи работы
-
Теоретические сведения
программных средств достаточно широк, но для изучения принципов и особенностей их применения в рамках данной лабораторной работы достаточно ограничиться методом Рунге–Кутта 1-го порядка (также именуемого методом Эйлера или методом прямоугольников). При этом программная реализация метода должна быть выполнена самостоятельно.
Метод предусматривает решение уравнений в дискретном времени на основе преобразования модели (1) в рекуррентные соотношения (рисунок 4):
Рисунок 4 – Рекуррентные соотношения
Точность решения, получаемого приближенными численными методами, повышается с уменьшением шага интегрирования, но при этом очевидно возрастает вычислительная трудоемкость решения задачи – количество шагов вычислений J и требуемое машинное время, а возможно, и объем используемой памяти компьютера при необходимости сохранения всего получаемого решения. Для моделей высокого порядка необоснованное уменьшение шага h может приводить к чрезмерному или недопустимому завышению требуемых ресурсов ЭВМ. Поэтому при реализации таких моделей вопрос выбора шага интегрирования для каждой модели требует отдельного решения с учетом необходимой точности получения результата и располагаемых вычислительных ресурсов. Выбор и обоснование величины шага интегрирования обычно возлагают на лицо, проводящее моделирование. Известны два основных подхода к контролю точности решения систем дифференциальных уравнений путем пошагового численного интегрирования. Первый предусматривает контроль точности в процессе интегрирования с уточнением величины каждого шага (контроль погрешности на шаге), второй – использование постоянной величины шага для всего интервала интегрирования и оценку погрешности по значениям переменных состояния только на правой границе интервала интегрирования t=T. В случае недопустимой величины погрешности процесс интегрирования повторяется с уменьшением величины шага.
В рамках данной лабораторной работы предусматривается использование второго подхода с контролем точности по конечному значению одной из переменных состояния модели y=xk(T), указанной в индивидуальном варианте задания.
Для оценки погрешности вычисления y с некоторым шагом h интегрирование повторяется с шагом h/2. Полученное с уменьшенным шагом значение y* принимается за эталонное. Тогда абсолютная погрешность вычисления y определяется как , относительная погрешность (4) Для автоматизации выбора шага интегрирования в рамках данной лабораторной работы предусматривается использование следующего алгоритма: 1. Задается исходное значение шага интегрирования h. 2. Проводится решение системы дифференциальных уравнений на интервале [0; T] с шагом h. 3. Решение повторяется с шагом h/2. 4. Проводится оценка погрешности по соотношению (4). 5. Если погрешность не превышает допустимого значения, шаг h, считается достаточным для обеспечения требуемой точности. В противном случае в качестве нового проверяемого значения шага h принимается h/2 и производится переход к п. 3. Таким образом обеспечивается последовательное уменьшение шага интегрирования в 2m (m=1, 2, …) раз до достижения требуемой точности решения.
-
Ход выполнения работы
Рисунок 10 – Зависимость точности от шага на диапазоне h от 0.01 до 1Рисунок 11 – Зависимость трудоёмкости от шага на диапазоне h от 0.01 до 1Решение системы дифференциальных уравнений на интервале [0; 12] с автоматическим выбором шага и начальным значением шага h=0.01 представлено на рисунках 12-16.Рисунок 12 – Значения x1 при шаге h = 7,8125E-05Рисунок 13 – Значения x2 при шаге h = 7,8125E-05Рисунок 14 – Значения x3 при шаге h = 7,8125E-05Рисунок 15 – Значения x4 при шаге h = 7,8125E-05Рисунок 16 – Значения x5 при шаге h = 7,8125E-05Листинг__1_–_Ф_айл__Euler.cs'>Листинг 1 – Файл Euler.csusing System;using System.Collections.Generic;namespace Method_Euler{class Euler{double[] xLast = { 1, 1, 0, 0, 0 };// Метод Эйлераprivate double[] Eul(double[] xLast, double[] x, double h){double[] res = new double[xLast.Length];for (int i = 0; i < xLast.Length; i++){res[i] = xLast[i] + x[i] * h;}return res;}// Решение систему дифференциальных уравнений с возвратом матрицы всех промежуточных решенийpublic Dictionary
{
double[] xNext = new double[5];
double teta, x4;
Dictionary
for (double t = 0; t < T; t += h)
{
result.Add(t, xLast); // Добавление нового значения в новый момент времени в словарь результатов
x4 = (Math.Abs(deltaLast) <= deltaMax) ? deltaLast : deltaMax * Math.Sign(deltaLast);
teta = (10000 - xLast[4]) / (b - V * t);
deltaLast = xLast[3];
xNext[0] = k * xLast[1] - k * xLast[0];
xNext[1] = xLast[2];
xNext[2] = l * xLast[0] - l * xLast[1] - m * xLast[2] + n * x4;
xNext[3] = -kt * x4 - i1 * xLast[1] - i2 * xLast[2] + s * (teta - xLast[1]);
xNext[4] = V * Math.Sin(xLast[0]);
xLast = Eul(xLast, xNext, h);
}
result.Add(T, xLast);
return result;
}
// Решение систему дифференциальных уравнений с возвратом конечного значения x5
public double getOnlyResult(double h, int k = 1, int l = 8, int m = 1, int n = 8, int kt = 100, int b = 22000, int i1 = 20, int i2 = 2, int s = 100, int V = 500, int T = 12, double deltaMax = 0.5d, double deltaLast = 0.0d)
{
double[] xNext = new double[5];
double teta, x4;
for (double t = 0; t < T; t += h)
{
x4 = (Math.Abs(deltaLast) <= deltaMax) ? deltaLast : deltaMax * Math.Sign(deltaLast);
teta = (10000 - xLast[4]) / (b - V * t);
deltaLast = xLast[3];
xNext[0] = k * xLast[1] - k * xLast[0];
xNext[1] = xLast[2];
xNext[2] = l * xLast[0] - l * xLast[1] - m * xLast[2] + n * x4;
xNext[3] = -kt * x4 - i1 * xLast[1] - i2 * xLast[2] + s * (teta - xLast[1]);
xNext[4] = V * Math.Sin(xLast[0]);
xLast = Eul(xLast, xNext, h);
}
return xLast[4];
}
}
}
Листинг 2 – Файл Form1.cs
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Method_Euler
{
public partial class Form1 : Form
{
double T = 12; // Рассматриваемый временной период
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Список объектов графиков
var charts = new List
// Предварительная очистка холстов графиков
foreach (var chart in charts)
{
chart.Series[0].Points.Clear();
}
double h = double.Parse(textBox1.Text.Replace('.', ',')); // Шаг
Euler euler = new Euler();
Dictionary
// Вывод графиков
foreach (var point in show)
{
for (int i = 0; i < charts.Count; i++)
{
charts[i].Series[0].Points.AddXY(point.Key, point.Value[i]);
}
}
var y1 = show[T][4];
var forError = euler.getResult(h / 2);
var y2 = forError[T][4];
var error = Math.Abs((y2 - y1) / y2) * 100; // Погрешность
label3.Text = y1.ToString();
label5.Text = error.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
// Предварительная очистка холстов графиков
chart6.Series[0].Points.Clear();
chart7.Series[0].Points.Clear();
Euler euler = new Euler();
for (double h = 0.001; h <= 1; h *= 2)
{
var y1 = euler.getOnlyResult(h);
var y2 = euler.getOnlyResult(h / 2);
var error = Math.Abs((y2 - y1) / y2) * 100; // Погрешность
chart6.Series[0].Points.AddXY(h, error);
chart7.Series[0].Points.AddXY(h, T / h);
}
}
private void button3_Click(object sender, EventArgs e)
{
// Список объектов графиков
var charts = new List
// Предварительная очистка холстов графиков
foreach (var chart in charts)
{
chart.Series[0].Points.Clear();
}
double h = double.Parse(textBox2.Text.Replace('.', ',')); // Начальный шаг
Euler euler = new Euler();
double error;
do
{
var y1 = euler.getOnlyResult(h);
var y2 = euler.getOnlyResult(h / 2);
error = Math.Abs((y2 - y1) / y2) * 100;
h /= 2;
} while (error > 1);
Dictionary
// Вывод графиков
int counter = 0;
foreach (var point in show)
{
counter++;
if (counter % 50 != 0) // Вывод каждой 50-той точки для ускорения рендеринга графиков
{
continue;
}
for (int i = 0; i < charts.Count; i++)
{
charts[i].Series[0].Points.AddXY(point.Key, point.Value[i]);
}
}
label8.Text = show[T][4].ToString();
label10.Text = error.ToString();
label12.Text = h.ToString();
}
}
}
-
Выводы
В ходе выполнения лабораторной работы была разработана программная имитационная модели нелинейной динамической системы.