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

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

.doc
Скачиваний:
11
Добавлен:
20.06.2014
Размер:
1.27 Mб
Скачать

2

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

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

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

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

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

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

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

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

на тему:

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

Студент

Понарьин С.Н.

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

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

Группа

АС-09

Принял

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

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

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

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

Липецк 2010

  1. 1. Задание:

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

Алгоритм оптимизации

  1. Функция

17 – метод дихотомии

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

  1. 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();

}

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

1.

2.

3.