Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи
з курсу
„ Дослідження комп'ютерних систем штучного інтелекту ”
Тема:
Задача пошуку нулів функції на відрізку
Виконав:
ст. гр. КСМм-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]: