Задание №4 к курсовому проекту

Итерационные процессы. Функции как параметры

Задание

Составить программу на языке Си с процедурами решения трансцедентных алгебраических уравнений различными численными методам (итераций, Ньютона и половинного деление — дихотомии). Уравнения оформить как функции параметры, разрешив относительно неизвестной величины в случае необходимости. Применить каждую процедуру к решению двух уравнений — заданного вариантом и следующего за ним. Если метод неприменим, дать математическое обоснование и графическую иллюстрацию, например, с использованием Гнуплота.

Краткие сведения из численных методов

Рассматривается уравнение вида F(x)=0. Предполагается, что функций F(x) достаточно гладкая, монотонная на этом отрезке и существует единственный корень уравнения x* ∈ [a,b]. На отрезке [a, b] ищется приближенное решение x с точностью ε, т. е. такое, что |x - x*| < ε.

При решении реальных задач, где поведение функции F(x) неизвестно, сначала производят исследование функции (аналитическое, численное или графическое), например, с помощью программ gnuplot, MathLab, MathCAD, Maple. Также выполняют т. н. отделение корней, т. е. разбивают область опреденения функции на отрезки монотонности, на каждом из которых имеется ровно один корень и выполняются другие условия применимости численных методов (гладкость). Различные численные методы предъявляют разные требования к функции F(x), обладают различной скоростью сходимости и поведением.

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

Метод дихотомии (половинного деления)

Очевидно, что если на отрезке [a, b] существует корень уравнения, то значения функции на концах отрезка имеют разные знаки: F(a) ⋅ F(b) < 0. Метод заключается в делении отрезка пополам и его сужении в два раза на каждом шаге итерационного процесса в зависимости от знака функции в середине отрезка.

  • За начальное приближение принимаются границы исходного отрезка a0 = a, b0 = b.

  • Итерационный процесс:
    • ak+1 = (ak + bk) / 2, bk+1 = bk, если F(ak) ⋅ F((ak + bk) / 2) > 0;

    • ak+1 = ak, bk+1 = (ak + bk) / 2, если F(bk) ⋅ F((ak + bk) / 2) > 0.

  • Условие окончания: |ak - bk| < ε.

  • Приближенное значение корня: x* ≈ (aконечное + bконечное) / 2.

Метод итераций

Идея метода заключается в замене исходного уравнения F(x) = 0 уравнением вида x = f(x).

Достаточное условие сходимости метода |f'(x)| < 1, x ∈ [a,b]. Это условие необходимо проверить перед началом решения задачи, так как функция f(x) может быть выбрана неоднозначно, причем в случае неверного выбора указанной функции метод расходится.

  • Начальное приближение корня: x0 = (a + b) / 2.

  • Итерационный процесс: xk+1 = f(xk).

  • Условие окончания: |xk - xk-1| < ε.

  • Приближенное значение корня: x* ≈ xконечное.

Метод Ньютона

Метод Ньютона является частным случаем метода итераций. Условие сходимости метода: |F(x) ⋅ F''(x)| < (F'(x))2 на отрезке [a, b]. Итерационный процесс: xk+1 = xk - F(xk)/F'(xk).

Варианты

Пример


#include <stdio.h>
#include <math.h>

float f(float x)
{
  return 0.6 * pow(3, x) - 2.3*x - 3; // Функция, корень которой нужно вычислить.
}

float f2(float x)
{
  return x*x - log(1 + x) - 3; // Вторая функция, корень которой нужно вычислить.
}

float dikh_method(float (*f)(float), float a0, float b0)

/* Функция dikh_method принимает указатель на функцию f
(которая принимает на вход значение переменной типа float,
и возвращает значение типа float), и два других значения типа float a0 и b0 */

{
  const float e = 0.00001;
  float a, b;
  a = a0;
  b = b0;
  while (fabs(a - b) > e){
    // Здесь должно быть описано вычисление корня уравнения по методу дихотомии.
  }
  return (a + b)/2;
}

int main()
{
  printf("%f\n", dikh_method(f, 2, 3));
  printf("%f\n", dikh_method(f2, 2, 3));
  return 0;
}