Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab17.doc
Скачиваний:
3
Добавлен:
13.09.2019
Размер:
185.34 Кб
Скачать

Міністерство освіти і науки, молоді та спорту України Технічний коледж національного університету водного господарства та природокористування Лабораторна робота № 17

з курсу “Основи програмування та програмного забезпечення”

Рівне 2012

Лабораторна робота № 17 “Розв’язування нелінійного рівняння з курсу “Основи програмування та програмного забезпечення”

Упорядники: Пастушенко В.Й., Шатний С.В.

Робота 17. Роз’язування нелінійного рівняння.

17.1. Мета роботи

Навчитися знаходити корені нелінійного рівняння.

17.2. Теоретичні відомості

Нехай потрібно знайти корінь нелінійного рівняння 3х-exp(x)=0. Спочатку знайдемо інтервал області визначення, в якому знаходиться корінь, чи один з коренів. Для цього слід провести табулювання функції y=3х-exp(x).

//Програма табулювання функції

#include<stdio.h>

#include<conio.h>

#include<math.h>

float F(float x)

{return 3xexp(x);}

main( )

{ clrscr( );

float x;

for(x=-2;x<=2;x+=0.5)

printf(“\n x=%4.1f y=%4.1f”,x,F(x));

getch( );

}

Таблиця результатів табулювання функції y=3x-exp(x)

x=-2.0

y=-6.1

x=-1.5

y=-4.7

x=-1.0

y=-3.4

x=-0.5

y=-2.1

x= 0.0

y=-1.0

x= 0.5

y=-0.1

x= 1.0

y= 0.3

x= 1.5

y= 0.0

x= 2.0

y=-1.4

Як видно із таблиці, корінь рівняння знаходиться на інтервалі [-2.0; 2.0]. Визначити корінь рівняння можна і графічним способом, побудувавши графік функції.

Уточнюють корені рівняння за допомогою методів:

  1. половинного ділення;

  2. простих ітерацій;

  3. хорд;

  4. дотичних.

1. Метод половинного ділення. Б лок схема методу половинного ділення

//Реалізація методу половинного ділення

#include<stdio.h>

#include<conio.h>

#include<math.h>

float F(float x)

{return 3x-exp(x);}

main( )

{ clrscr( );

float a=-1, b=1, x0, x1, eps=1e-4;

int k=0;

A: x0=(a+b)/2;

if(fabs(a-b)>eps)

{ if (F(a)*F(x0)>0) a=x0;

else b=x0;

k++; goto A;

}

printf(“\nx0=%.7fF(x0)=%.7f k=%d eps=%.e”,x0,F(x0),k,eps);

getch( );

}

Результати виконання програми:

№ п/п

х

k

1

0.61904

15

10-4

2

0.619060

18

10-5

3

0.6190610

21

10-6

2. Метод простих ітерацій.

Перетворимо рівняння f(x)=0 до виду x=(x). Оскільки довільний перехід не завжди забезпечує збіжність методу, то використаємо методику, що гарантує відповідне перетворення рівняння до виду x=(x).

В цьому випадку функцію подають у вигляді . В такому представленні невідомим є лише число k. Його значення знаходять із співвідношення |k|Q/2, де . Знайдемо похідну заданої функції і її максимальне значення на інтервалі [-1.0;1.0]. Похідна заданої функції f(x)=3-ex. Тоді . Оскільки функція монотонно зростає на цьому інтервалі, то достатньо знайти її значення на кінцях інтервалу і вибрати найбільше. Таким чином . Значення k згідно вищенаведеного співвідношення |k|Q/2=2.63/2 вибираємо рівним k=2 (k має додатній знак, оскільки похідна f(x)>0 на вибраному інтервалі).

Тепер функцію (х) можна записати таким чином .

Знайдемо значення q:

Таким чином, знайдене представлення функції (х) дозволяє забезпечити збіжність послідовності наближених розв’язків даного рівняння до точного цим методом.

Б лок-схема методу простих ітерацій

//Реалізація методу простих ітерацій

#include<stdio.h>

#include<conio.h>

#include<math.h>

float Fi(float x)

{return x-0.5(3x-exp(x));}

main( )

{ clrscr( );

float a=-1, b=1, x0=(a+b)/2, x1, q=0.86, eps=1e-6;

int k=0;

A: x1=Fi(x0);

if(fabs(x0-x1)>eps(1-q)/q)

{x0=x1; k++; goto A;}

printf(“\n x1=%.7f k=%d eps=%.ef”,x1,k,eps);

getch( );

}

Результати виконання програми:

№ п/п

х

k

1

0.61905

11

10-4

2

0.619060

14

10-5

3

0.6190612

17

10-6

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]