Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи
з курсу
„ Дослідження комп'ютерних систем штучного інтелекту ”
Тема:
Задача пошуку нулів функції на відрізку
Виконав:
ст. гр. КСМм-1
Львів – 2007
Мета: Ознайомитись із алгоритмами розв’язання задачі пошуку нулів функції на заданому відрізку та написати програму, яка б реалізовувала один з цих алгоритмів.
Завдання
Написати програму, яка шукає нулі функції cos(1/X) - X*sin(5/X) на заданому інтервалі із заданою точністю.
Лістинг програми
// max_AI_lab1.cpp
#include "stdafx.h"
#include "stdio.h"
#include "math.h"
// діапазон пошуку нулів
#define LEFT -0.01
#define RIGHT 0.01
double step = 0.0001; // крок основного проходу
double stepE = 0.000000001; // крок додаткового (уточнюючого) проходу
double Result; // сюди зберігається результат
double func (double X) // власне формула обчислення функції
{ return ( cos(1/X) - X*sin(5/X) ); }
int isZero (double); // пошук нулів функції - загальний "грубий" прохід
double extra (double, double); // знаходження точної позиції даного
// конкретного нуля
// ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ MAIN ‡‡‡
int main(int argc, char* argv[])
{
double i;
long znum=1,totalops=0;
for ( i = LEFT ; i < RIGHT ; i += step)
if ( isZero(i) == 1 )
{
printf("got a zero #%04d @ %16.9f\n",znum,Result);
znum++;
}
return 0;
}
// ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ isZero ‡‡‡ "грубий прохід"
int isZero (double var)
{
double y, yPrev;
double varPrev = var - step;
y = func (var); // знач. ф-ції в даній точці
yPrev = func (varPrev); // знач. ф-ції в попередній точці
if ( ( (y > 0) && (yPrev < 0) ) || // перетин нуля з "+" в "-"
( (y < 0) && (yPrev > 0) ) ) // перетин нуля з "-" в "+"
{ // більш точне визначення нуля в заданому діапазоні
Result = extra (varPrev,var);
return 1;
} else if (y==0) // bull's eye!
{
Result = var;
return 1;
}
return 0;
}
// ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ extra ‡‡‡ уточнення нуля
double extra (double varStart, double varStop) // пошук з підвищеною точністю
{
double i;
for ( i=varStart ; i<=varStop ; i+=stepE)
{
// printf(".");
double y = func(i);
double yPrev = func(i-stepE);
if ( ( (y > 0) && (yPrev < 0) ) || ( (y < 0) && (yPrev > 0) ) )
return ( i - stepE/2 );
else if ( y==0 )
return ( i );
else if ( yPrev==0 )
return ( i-stepE );
}
return 0;
}
Графічне подання функції на досліджуваному відрізку
Результати виконання роботи
Знайдені програмою нулі функції cos(1/X) - X*sin(5/X) на відрізку [-0.01; 0.01]:
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!