Загрузил lyudmila.archackowa

Примеры реализации алгоритмов численных методов (язык c)

реклама
Примеры реализации алгоритмов численных методов
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();
}
Скачать