Примеры реализации алгоритмов численных методов 1. Метод Эйлера для решения дифференциальных уравнений: #include <stdio.h> #include <math.h> #include <malloc.h> // метод, возвращающий значение заданной функции double function(double x, double y) { return x * x - 2 * y; } // метод для решения ду методом Эйлера void Eiler() { // исходные данные int a = 0; // начало отрезка int b = 1; // конец отрезка double x = 0; // начальное значение x (x0) double y = 1; // начальное значение y (y0) double h = 0.1; // шаг // цикл для построения таблицы со значениями функции for (double i = a; i <= b; i = i + h) { printf("x = %.2f, y = %.5f\n", x, y); y = y + h * function(x, y); // подсчет следующего значения функции x = x + h; // увеличение узла на шаг } } int main() { Eiler(); } 2. Нахождение отрезков изоляции: #include <stdio.h> #include <math.h> #include <malloc.h> // структура, хранящая концы отрезков изоляции struct suspicious { double start; // начальное значение структуры double finish; // конечное значение структуры }; // метод, возвращающий значение заданной функции double function(double x) { return cos(2 * x) - 3 * x * x + 1; } // метод, возвращающий значение производной заданной функции double derivative(double x) { return -2 * sin(2 * x) - 6 * x; } // метод для определения отрезков изоляции void insulationСut() { system("chcp 1251>nul"); // исходные данные double a = -10; // начало отрезка double b = 10; // конец отрезка double h = 1; // шаг // определяем количество отрезков, подозрительных на отрезки изоляции int k = 0; for (int i = a; i < b; i += h) { if (function(i) * function(i + h) < 0) { // так как нужно найти соседние значения функции с разными знаками, то их произведение точно будет отрицательным k++; } } printf("Количество отреков равно %d\n", k); // создаем массив структур для хранения отрезков изоляции struct suspicious* arraySus = (struct suspicious*)calloc(k, sizeof(struct suspicious)); int n = 0; // индекс массива структур // заполняем массив концами отрезков изоляции: int j = 0; for (double i = a; i < b; i++) { if (func(i) * func(i + 1) < 0) { arraySus[n].start = i; arraySus[n].finish = i + h; n++; } } double h1 = h / 10; // новый шаг (для производной) // проверка того,что производная сохраняет знак for (int i = 0; i < k; i++) { bool flag = true; // флаг, который нужен для выхода из цикла в том случае, если знак производной поменяется for (double j = arraySus[i].start; j < arraySus[i].finish-h1; j += h1) { if (derivative(j) * derivative(j + h1) < 0) { flag = false; break; } } if (flag) { printf("[%f %f] - отрезок изоляции\n", arraySus[i].start, arraySus[i].finish); } } int main() { insulationСut(); }