Курсовая работа: Численное дифференцирование

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


Дата добавления на сайт: 08 февраля 2025

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
по дисциплине «Вычислительная математика»
на тему «Численное дифференцирование»

Введение

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

1. Обзор методов численного дифференцирования

.1 Вычисление производной, используя простейшие формулы

Предположим, что функция f дифференцируема в окрестности точки х достаточное количество раз[1]. Исходя из определения производной:

Численное дифференцирование (рис. 1)

можно получить две простейшие приближенные формулы:

Численное дифференцирование (рис. 2)
Численное дифференцирование (рис. 3)

где h - малый параметр (шаг).
Эти формулы часто называют правой и левой разностными производными.
Оценка погрешностей данных формулы производится по следующей формуле:

Численное дифференцирование (рис. 4)
где
Численное дифференцирование (рис. 5)

где Численное дифференцирование (рис. 6) - точка, принадлежащая промежутку Численное дифференцирование (рис. 7)).
Таким образом, формулы левых и правых разностных производных имеют первый порядок точности.
Для вычисления второй производной данным методом применяется следующая формула:

Численное дифференцирование (рис. 8)

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

Численное дифференцирование (рис. 9)

отсюда получаем:

Численное дифференцирование (рис. 10)

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

Численное дифференцирование (рис. 11)

Таким образом вторая разностная производная имеет второй порядок точности.
Приведенные формулы численного дифференцирования имеют простую геометрическую интерпретацию. На рисунке 1.1 a) изображен график функции и отмечены точки N-, N0 и N+, с координатами (x-h, f(x-h)), (x,f(x)) и (x+h,f(x+h)) соответственно.

Численное дифференцирование (рис. 12)
Рисунок 1.1 - Графики функций

Производная f’(x) равна tg(Численное дифференцирование (рис. 13)) относительно оси Ox в точке N0. Тангенс угла наклона прямых N- N0 и N+ N0, близок к значению производной в точке х. Однако можно заметить, что тангенс прямой N- N+, которая изображена на рисунке 1.1 б), более близок к искомому значению.
Логично предположить, что можно использовать тангенс прямой N- N+ для более точного нахождения производной в указанной точке. Получившаяся формула выглядит следующим образом:

Численное дифференцирование (рис. 14)

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

Численное дифференцирование (рис. 15)
где
Численное дифференцирование (рис. 16)

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

Численное дифференцирование (рис. 17)

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

.2 Численное дифференцирование, основанное на интерполяции алгебраическими многочленами

Предположим, что f(x) в окрестности точки x аппроксимируется некоторой другой функцией g(x), и производная g’(x) легко вычисляется[2]. Тогда:

Численное дифференцирование (рис. 18)

Пусть Pn(x) - интерполяционный многочлен n-ой степени с узлами интерполяции x0 x010,900321,164010,09968-0,164014925181000,785390,707100,636630,636630,070470,070475660184001,5707900,372940,10925-0,37294-0,10925514017143
По результату первого теста можно заметить, что точность методов колеблется в различных точках. Формулы разностных производных работают быстрее полиномиальной интерполяции примерно в 3.4 раза быстрее.
Второй тест был проведен с использованием функции Численное дифференцирование (рис. 82) Производная данной функции задается следующей формулой: Численное дифференцирование (рис. 83)Результаты теста представлены в таблице 3.2. В данном тесте функция задавалась четырьмя точками.

Таблица 3.2 - Второй тест программы
x
-1-2-1-2-10535021400
000000491020000
122020480022650
243140490020550

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

Таблица 3.3 - Третий тест программы
x
0,21,22141,35211,22092-0,13070,00048547024550
0,41,491821,501781,49192-0,01005-0,0001470025200
0,61,822111,83431,82203-0,012190,00008515024000
0,82,225542,240432,22574-0,01489-0,0002510024000
12,718282,46372,717550,254580,00073530023800

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

Таблица 3.4 -Четвертый тест программы
x
-1-0,36787-0,43248-0,177950,06461-0,18992500028900
-0,5-0,45489-0,36787-0,49623-0,087020,04134520027800
000,260550,02263-0,26055-0,02263475029300
0,52,06092,718282,03589-0,657380,02501555030330
18,154849,671628,21011-1,51678-0,05527505032200
1,523,5288614,7310423,220288,797820,30858590033900

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

Численное дифференцирование (рис. 88)
Рисунок 3.2 - График зависимости Численное дифференцирование (рис. 89) от количества точек

Из графика видно прямую зависимость Численное дифференцирование (рис. 90) от количества заданных точек.
На основании данных тестов можно сделать вывод, что разностные формулы численного дифференцирования в большинстве случаев менее точны, чем использование интерполяционного полинома Лагранжа, однако они работают значительно быстрее.
Также были проведены тесты, когда были введены неверные входные данные (различные значения функции в одинаковых точках, данные, не соответствующие формату и др.). Во время этих тестов ошибок, приводящих к не правильному решению или экстренному завершению программы, обнаружено не было.

Заключение
численный дифференцирование многочлен интерполяция
В результате проделанной работы были изучены следующие методы численного дифференцирования: формулы разностных производных, дифференцирования с помощью интерполяционного многочлена Лагранжа.
У каждого метода были выявлены сильные и слабые стороны.
Сильной стороной формул разностных производных является быстрота их выполнения. Однако данные формулы не могут рассчитывать производные в точках, отличных от узловых. Также, на основанию проведенных опытов было установлено, что данные формулы обычно имеют меньшую точность.
Дифференцирование с использование интерполяционного многочлена Лагранжа позволяет находить значение производной в точках, отличных от узловых. Также имеет в большинстве случаев большую точность. Если известно, что функция должна представлять полином, то погрешность метода стремится к нулю. Однако, данный метод требует больших вычислительных затрат, т.к. требуется решать систему уравнений, возводить числа в степень.
Был составлен алгоритм решения задачи различными способами.
На основании алгоритмов была составлена программа, реализующая данные методы.
В ходе тестов программы не было обнаружено критических ошибок.
Тестирование программы на различных данных показало, что формулы численного дифференцирования могут использоваться в практических целях. Однако их нужно использовать осторожно, т.к. каждый из методов в определенных точках может иметь очень большую погрешность.

Список литературы

1А.А.Амосов, Ю.А.Дубинский, Вычислительные методы для инженеров. - М.: Высш.шк., 2014. - с.544
2David Kincaid and Ward Cheney, Numerical analysis: mathematics of scientific computing. - Wadsworth, Inc., Belmont, California, 2011. - с.701
3Н. С. Бахвалов, Численные методы. - М.: Наука, 2009. - с.190

Приложения

Приложение А

Текст программы
Модуль Form1.cs:
using System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.Diagnostics;Kursavik_sem_3
{partial class Form1 : Form
{Form1()
{();
}dif;Razn;Interp;form2;void Form1_Load(object sender, EventArgs e)
{
//задачем начальные значения программы.Text = "The programm";
listBox1.Items.Add("0,2 1,2214");.Items.Add("0,4 1,49182");.Items.Add("0,6 1,82211");.Items.Add("0,8 2,22554");.Items.Add("1,0 2,71828");= new RaznDiffer(label8);= new InterDiffer(label8);= Razn;.SelectedItem = 0;.SelectedIndex = 0;.ResetText();= new Form2(this);.Invalidate();
}void button1_Click(object sender, EventArgs e)
{.ResetText();x, y;
try
{
//если значения нормально конвернтируются
//то добавляем их к другим точкми
x = Convert.ToDecimal(textBox1.Text);= Convert.ToDecimal(textBox2.Text);strX, strY;= Convert.ToString(x);= Convert.ToString(y);.Items.Add(x+" "+y);
}(FormatException)
{.Show("Invalid data!\nPlease, enter other data.", "Error converting");
}
}void button2_Click(object sender, EventArgs e)
{
{.SelectedObjectCollection col = listBox1.SelectedItems;(col.Count!=0)
{.Items.Remove(col[0]);
}
}(ArgumentOutOfRangeException)
{.Show("None selected", "Error");
}
}void textBox1_KeyDown(object sender, KeyEventArgs e)
{(e.KeyValue == 13) button1_Click(this, e);
}void StrDiv(string str, out decimal x, out decimal y)
{
//разбираем строку на состовляющие числа.
string strF="";i = 0;(str[i] != ' ') strF += str[i++];= Convert.ToDecimal(strF);= "";(i mat[0, j])
{= mat[0, i]; buf2 = mat[1, i];[0, i] = mat[0, j]; mat[1, i] = mat[1, j];[0, j] = buf1; mat[1, j] = buf2;
}
}
//находим проихводную, если это возможно(dif.isSolve(mat, x1))
{
//timer для подчета тактов процессораtimer = new Stopwatch();
timer.Start();.Text = String.Format("f'(x) = {0:F5}", dif.Solve(mat, x1));.ShowAnswer();.Stop();.Text += String.Format("\nTime: {0} ticks.", timer.ElapsedTicks);.Invalidate();
}label1.Text = "Нет решения";
}void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//переключаем интерфейсную ссылку на нужный режим
if (comboBox1.SelectedIndex == 0) dif = Razn;dif= Interp;
}void panel1_Paint(object sender, PaintEventArgs e)
{buffer;context;= BufferedGraphicsManager.Current;.MaximumBuffer = new System.Drawing.Size(panel1.Width + 1, panel1.Height + 1);rec = new Rectangle(0, 0, panel1.Width, panel1.Height);= context.Allocate(e.Graphics, rec);
//ТУТ ДОЛЖНА БЫТЬ ОТРИСОВКА КООДРИНАТНОЙ СЕТКИ
//И графика из точек
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++zoom = form2.trackBar1.Value;font = new System.Drawing.Font("Arial", 6);
//используемые кистиpen = new Pen(Color.Black); //для секти
Pen penRed = new Pen(Color.Red);//для графика по точкам
//используемые заливки
Brush brush = new SolidBrush(Color.Black); //для сетки
//Отрисовка системы коодринат.Graphics.Clear(Color.White);Xs = (int)(form2.x*zoom);Ys = (int)(form2.y * zoom);maxX = panel1.Width / 2 ;maxY = panel1.Height / 2 ;.Graphics.TranslateTransform(maxX-Xs, maxY+Ys);
//рисуем оси Х и Y, а так же разметку
buffer.Graphics.DrawLine(pen, 0, maxY-Ys, 0, -maxY-Ys);.Graphics.DrawLine(pen, maxX+Xs, 0, -maxX+Xs, 0);
//int stepX =StepM = panel1.Width / zoom;StepMin = (int)(maxX - Xs)/zoom;(int j = 0; j points[j].X)
{= points[i];[i] = points[j];[j] = buf;
}
}(int i = 0; i 0.0000001M)
{= false;;
}(matrix[0, i] == point) PointFind = true;
}PointFind&&StepRight;
}decimal Solve(decimal[,] matrix, decimal point)
{pointInd=0;N=matrix.GetLength(1);
decimal h = matrix[0, 1] - matrix[0, 0];
//ищем номер точки для дифференцирования
for (int i=0; i 0; i--)
{.Text += String.Format("{0:F5}x^{1} + ", intrFunc[i], i);
}.Text += String.Format("{0:F5}\n", intrFunc[0]);.Text += "Derivative of Polynomial:\n";(int i = difPolinom.Length - 1; i > 0; i--)
{.Text += String.Format("{0:F5}x^{1} + ", difPolinom[i], i);
}.Text += String.Format("{0:F5}\n", difPolinom[0]);
}
}
}
Модуль MathBase.cs:System;System.Collections.Generic;System.Linq;System.Text;Kursavik_sem_3
{MathBase
{
//метод копирует матрицу MatIn в матрицу MatOutvoid copy(decimal[,] MatIn, decimal[,] MatOut)
{a = MatIn.GetLength(0);b = MatIn.GetLength(1);(int i = 0; i maxVol)
{= Math.Abs(matrix[j, i]);= j;
}
}
//меняем строки местами(matrix,max,sw);kof;
//вычитаем строки.(int j = i + 1; j = 0; i--)
{resul = buffer[i, b - 1];(int j = b - 2; j > i; j--) resul -= buffer[i, j] * Solve[j];[i] = resul / buffer[i, i];
}
}
//метод берет производную от полиномаstatic void GetDifferPolinom(decimal[] inMat, decimal[] outMat)
{(int i = 0; i Grafic (рисуонк Б.7).

Численное дифференцирование (рис. 97)
Рисунок Б.7 - Включение окна настройки графика

В окне настройки графика возможно:
) Задать смещение графика по осям.
) Задать масштаб графика.

Численное дифференцирование (рис. 98)
Рисунок Б.8 - Настройка графика

Настройки графика.
Для настройки смещения графика по осям, необходим в поля (выделены 1 на рисунке Б.9) прописать необходимое смещения.
Для масштабирования графика необходимо двигать ползунок (выделен 2 на рисунке Б.9).

Численное дифференцирование (рис. 99)
Рисунок Б.9 - Выбор параметров графика

Комментарии:

Вы не можете оставлять комментарии. Пожалуйста, зарегистрируйтесь.