Решением задачи Коши для дифференциального уравнения порядка m называется такая функция y(x), которая удовлетворяет m начальным условиям. Исходя из названия поста и вышесказанного определения, можно догадаться, что сегодня мы будем писать программу, а точнее класс, на C#, в котором будут описаны функции вычисления приближенного значения решения задачи Коши для дифференциального уравнения первого порядка.
Небольшая подготовка и составление плана
В нашем классе, который назовем NumDifferentiation, должны быть описаны методы, вычисляющие приближенное значение решения задачи Коши с заданной точностью в заданной точке x. Поэтому первым шагом я предлагаю написать класс CauchyConditions, который будет содержать три свойства:
- функцию первой производной — y’ = f(x, y)
- начальную точку x0
- точку y0 — значение решения задачи Коши в точке x0
После чего можно приступать к основному классу. Как я сказал ранее, он будет содержать не один метод, а целых четыре, каждый из которых будет находить значения, используя различные численные методы:
- метод Эйлера
- метод Эйлера-Коши
- модифицированный метод Эйлера
- метод Рунге-Кутты
Подробнее познакомиться с каждым из этих методов Вы можете в этой статье, а здесь я просто выложу формулы.
Класс CauchyConditions
Все три свойства делаем автореализуемыми с доступом "только для чтения" и описываем один конструктор, в котором инициализируем каждое из свойств.
Класс NumDifferentiation
Этот класс получился довольно большим, поэтому будем изучать его по частям, а в конце соберем это все воедино.
Немного о концепции
Хотя публичных методов будет всего четыре, приватных будет намного больше. Все это сделано с целью избавиться от повторяющегося кода. Главный метод — метод под названием RungeMethod. Он вызывается при вычислении каждым численным методом. Его назначение — добиться указанной (переданной в качестве параметра) точности. Этот метод в свою очередь вызывает метод calculation, который собственно и вычисляет нужное значение тем численным методом, который передадим в качестве параметра.
Думаю, так сразу понять довольно сложно, поэтому плавно перейдем к коду.
Публичные методы
Как и говорилось ранее, в качестве параметров передается точка x, точность и условие Коши, а возвращается результат метода RungeMethod. Вновь вызываемый метод принимает 5 параметров:
- точку x
- точность eps
- условия Коши conditions
- способ вычисления (функция)
- порядок точности численного метода (используется для оценки погрешности по принципу Рунге)
Метод RungeMethod
Здесь просто реализована оценка погрешности по принципу Рунге. Значение будет перевычисляться до тех пор, пока заданная точность не будет достигнута, или же количество заходов в цикл не станет равным двадцати.
В метод calculation передаются параметры:
- та же точка x
- шаг (используется в формулах численных методов)
- те же условия Коши
- способ вычисления (wayCalc)
Метод calculation
wayCalc — любой из нижеперечисленных методов
Эти методы возвращают значение второго слагаемого формулы соответствующего метода, т.е. то, что идет после yi.
Теперь код всего класса NumDifferentiation
2 отзыва на “ Приближенное решение задачи Коши на C# ”
Спасибо! Очень полезная статья! Вы не могли бы описать процедуру решения модифицированным методом Эйлера для ОДУ 2-го порядка?
Благодарю за отзыв! Возьму на заметку предложенную тему, однако сейчас не так много времени, поэтому не могу сказать, когда появится подобная статья.