Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №3 Вариант 2

.doc
Скачиваний:
10
Добавлен:
20.06.2014
Размер:
395.26 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №3

«Программирование элементарных численных методов»

по дисциплине

«Технология программирования»

Студент

Бутаков В.В.

подпись, дата

фамилия, инициалы

Группа

АС-09

Принял

Домашнев П.А.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2010

  1. Задание

Цель работы

Приобретение навыков программирования элементарных численных методов.

Задание кафедры

Написать программу, осуществляющую поиск оптимального значения функции или решение уравнения заданным методом. Интервал поиска (или начальную точку – в зависимости от метода) вводит пользователь. На экране пользователю должен отображаться ход решения, т.е. все промежуточные точки и значения функции в этих точках. Начальные условия (функция, интервал/начальная точка) и ход поиска должны дублироваться в текстовый файл. Имя файла вводит пользователь. Интервал/начальную точку выбирать в пределах [-10;10].

Функция: .

Вариант 2

Метод Фибоначчи

  1. Краткие теоретические сведения.

Поиск оптимума методом Фибоначчи

Для поиска оптимума функции f(x) на интервале [a,b] используется специальная последовательность чисел F(n)=F(n-1)+F(n-2), F(0)=F(1)=1;

Количество шагов приближения, s, вычисляют по формуле: N=(b-a)/delta, так что F(s-1) < N <= F(s); при непосредственном поиске оптимума используют минимальный шаг h_min=(b-a)/F(s). Вычисления заканчиваются, когда в расчетах использованы все числа F(s).

Алгоритм

h_min:=(N*gamma)/fib[j];

x1:=a;

x2:=b;

for i:=S-2 downto 1 do

y1:=f(x1);

y2:=f(x2);

if (abs(y1)>abs(y2)) then

x1:=x1+h_min*fib[j];

if (abs(y1)<abs(y2)) then

x2:=x2-h_min*fib[j];

if (abs(y1)=abs(y2)) then

x1:=x1+(h_min/2)*fib[j];

x2:=x2-(h_min/2)*fib[j];

x_opt:=(x1+x2)/2;

  1. Блок-схема программы

  1. Листинг программы

#include<stdio.h>

#include<windows.h>

#include<conio.h>

#include<math.h>

#include<string.h>

int *n,e,k=0;

double a,b,ya,yb;

FILE *D;

double func(double x)

{

return sin(x*x/10)*exp(x/10)/(x*x+1);

}

double fibon()

{

k--;

double x1,x2,y1,y2;

x1=b-n[k-1]*(b-a)/n[k];

x2=a+n[k-1]*(b-a)/n[k];

y1=func(x1);

y2=func(x2);

printf("\nStep %d\na=%g\ty(a)=%g\nb=%g\ty(b)=%g\nx1=%g\ty(x1)=%g\nx2=%g\ty(x2)=%g\n",e-k+1,a,ya,b,yb,x1,y1,x2,y2);

fprintf(D,"\nИтерация %d\na=%g\ty(a)=%g\nb=%g\ty(b)=%g\nx1=%g\ty(x1)=%g\nx2=%g\ty(x2)=%g\n",e-k+1,a,ya,b,yb,x1,y1,x2,y2);

if(ya*y2<=0)

{

b=x2;

yb=y2;

}

else if(yb*y1<=0)

{

a=x1;

ya=y1;

}

else

{

printf("There is no solution!!!");

fprintf(D,"There is no solution!!!");

fclose(D);

getch();

exit(1);

}

if(k>1)fibon();

if(abs(ya)<abs(yb))return a;

else return b;

}

void main()

{

char name [20];

printf("Input file's name:\t");

scanf("%s",name);

strcat(name,".txt");

D=fopen(name,"w");

printf("Input a low bound:\t");

scanf("%lf",&a);

ya=func(a);

printf("Input a high bound:\t");

scanf("%lf",&b);

yb=func(b);

printf("Input count of steps:\t");

scanf("%d",&e);

n=new int[e+1];

n[0]=1;

n[1]=1;

k=e+1;

for(int i=2;i<e+1;i++)n[i]=n[i-1]+n[i-2];

fprintf(D,"Функция: y=sin(x*x/10)*exp(x/10)/(x*x+1)\nНижняя граница пойска: x=%g\nВерхняя раница пойска: x=%g\n",a,b);

a=fibon();

printf("\nDecision: x=%g",a);

fprintf(D,"\nРешение: x=%g",a);

fclose(D);

getch();

}

  1. Контрольный пример