Лабораторная работа №3 Вариант 17
.doc
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №3
по дисциплине
«Технология программирования»
на тему:
«Программирование элементарных численных методов»
|
Студент |
|
|
|
Понарьин С.Н. |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-09 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
Домашнев П.А. |
|
||||||||
|
|
|
|
|
|
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2010
-
1. Задание:
Написать программу, осуществляющую поиск оптимального значения функции или решение уравнения заданным методом. Интервал поиска (или начальную точку – в зависимости от метода) вводит пользователь. На экране пользователю должен отображаться ход решения, т.е. все промежуточные точки и значения функции в этих точках. Начальные условия (функция, интервал/начальная точка) и ход поиска должны дублироваться в текстовый файл. Имя файла вводит пользователь.
Алгоритм оптимизации |
|
17 – метод дихотомии |
|
-
2. Блок-схема программы
-
3. Листинг программы
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <locale.h>
#include <string.h>
double f(float x)
{
return sin(x*x/10)*exp(x/10)/(x*x+1);
}
int main()
{
setlocale(LC_ALL,"Rus");
double a,b,c,epsilon;
char namefile[20];
FILE *fp;
printf("Введите левый конец отрезка в пределах [-10;10]: ");
scanf("%lf",&a);
printf("Введите правый конец отрезка в пределах [-10;10]: ");
scanf("%lf",&b);
if (a>b)
{
printf("Начало отрезка не может быть больше конца отрезка");
getch();
return 0;
}
if(a<-10||a>10||b>10||b<-10)
{
printf("\nКонцы отрезков не входят в [-10;10]");
getch();
return 0;
}
printf("Введите точность: ");
scanf("%lf",&epsilon);
printf("Введите имя файла, в который будет записан ход решения: ");
scanf("%s",&namefile);
strcat(namefile,".txt");
fp=fopen(namefile,"w");
fprintf(fp,"Ход нахождения корней функции:\nsin(x^2/10)*exp(x/10)/(x^2+1)
на отрезке: [%lf;%lf] с точностью: %lf\n\n",a,b,epsilon);
printf("\n");
if(f(a)*f(b)>0)
{
printf("Нет решения, так как функция на концах отрезков имеет
одинаковые знаки...");
fprintf(fp,"Нет решения, так как функция на концах отрезков имеет
одинаковые знаки...");
getch();
return 0;
}
while(fabs(b-a) > epsilon)
{
c=(a+b)/2;
printf("a=%lf b=%lf c=%lf ",a,b,c);
printf("f(a)=%lf f(b)=%lf f(c)=%lf\n",f(a),f(b),f(c));
fprintf(fp,"a=%lf b=%lf c=%lf ",a,b,c);
fprintf(fp,"f(a)=%lf f(b)=%lf f(c)=%lf\n",f(a),f(b),f(c));
if(f(b)*f(c)<0)
a=c;
else
b=c;
}
c=(a+b)/2;
printf("a=%lf b=%lf c=%lf ",a,b,c);
printf("f(a)=%lf f(b)=%lf f(c)=%lf\n",f(a),f(b),f(c));
printf("\n\nКорень: %lf",c);
fprintf(fp,"a=%lf b=%lf c=%lf ",a,b,c);
fprintf(fp,"f(a)=%lf f(b)=%lf f(c)=%lf\n",f(a),f(b),f(c));
fprintf(fp,"\n\nКорень: %lf",c);
getch();
}
-
4. Контрольный пример
1.
2.
3.