Лабораторная работа №3 Вариант 2
.docФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №3
«Программирование элементарных численных методов»
по дисциплине
«Технология программирования»
|
Студент |
|
|
|
Бутаков В.В. |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-09 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
|
|
|
|
Домашнев П.А. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2010
-
Задание
Цель работы
Приобретение навыков программирования элементарных численных методов.
Задание кафедры
Написать программу, осуществляющую поиск оптимального значения функции или решение уравнения заданным методом. Интервал поиска (или начальную точку – в зависимости от метода) вводит пользователь. На экране пользователю должен отображаться ход решения, т.е. все промежуточные точки и значения функции в этих точках. Начальные условия (функция, интервал/начальная точка) и ход поиска должны дублироваться в текстовый файл. Имя файла вводит пользователь. Интервал/начальную точку выбирать в пределах [-10;10].
Функция: .
Вариант 2
Метод Фибоначчи
-
Краткие теоретические сведения.
Поиск оптимума методом Фибоначчи
Для поиска оптимума функции 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;
-
Блок-схема программы
-
Листинг программы
#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();
}
-
Контрольный пример