Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursach_YaVU_dihotomia.doc
Скачиваний:
4
Добавлен:
07.07.2019
Размер:
190.46 Кб
Скачать

2.4 Входные и выходные данные

Входные данные:

1. Коэффициенты функции (a0,а1,а2,a3,а4,а5) – действительные числа

2. Интервал поиска – действительные числа

3. Точность – пользователь может указать точность большую 0,000001

Выходные данные:

Значение максимума и минимума.

3. Руководство программиста

3.1 Назначение и условия применения программы

Назначение программы:

Программа предназначена для поиска минимума и максимума функции на заданном интервале. Используется для функций вида с максимальной степенью х, равной 5.

Минимальные требования:

  • Процессор Intel Pentium II.

  • Наличие не менее 16Mб ОЗУ.

  • Наличие не менее 1Мб свободного дискового пространства.

  • SVGA – графический адаптер.

  • Минимальный набор периферийного оборудования.

Программное обеспечение, необходимое для функционирования программы:

  1. Операционная среда Windows 95/98/Me/2k/XP

  2. Microsoft Visual Studio 2005

3.2 Характеристики программы

  • Для выполнения программы требуется сравнительно небольшой промежуток времени.

  • В программе присутствует проверка введенных данных, что позволяет предопределить возможные ошибки и оповестить об этом пользователя

3.3 Обращение к программе

Для начала работы программы необходимо запустить файл dichotomy.exe

3.4 Входные и выходные данные

Входные данные:

1. Коэффициенты функции (a0,а1,а2,a3,а4,а5) – действительные числа

2. Интервал поиска – действительные числа

3. Точность – пользователь может указать точность большую 0,000001

Выходные данные:

Значение максимума и минимума.

3.5 Сообщения

Сообщения, выводимые пользователю:

  1. Введен неверный интервал!

Причины возникновения:

- левая граница больше правой

- левая граница равна правой

  1. Введена неверная точность!

Причины возникновения:

  • Введена неверная точность

4. Описание контрольного примера

В качестве контрольного примера рассмотрим работу программы с функцией f (x) = 2 + 3 - 2 + 4 + 8

Интервал поиска: [-6; 7]

Точность: 0,01

Результат обработки контрольного примера (Рис.1)

Проверим правильность расчетов:

Минимум функции (Рис.2)

Таким образом, графически проверена правильность вычислений.

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

#include "stdafx.h"

#include <locale.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

#include <stdio.h>

//-------------------------------------------------------------------

void menu();

void out(const char*,double);

double func(double,double,double,double,double,double,double);

double dihotomy(double,double,int,double,double,double,double,double,double,double);

//-------------------------------------------------------------------

void main()

{

setlocale(LC_ALL, "rus");

system("color 71");

double A,B,t,a0,a1,a2,a3,a4,a5,mn,mx;

char NumberOfAction;

int resultCase=1;

while(resultCase!=0)

{

do

{

menu();

NumberOfAction=getch();

}

while (NumberOfAction!='1' && NumberOfAction!='2' && NumberOfAction!='3' && NumberOfAction!='4' && NumberOfAction!='e');

switch (NumberOfAction)

{

//case '1' (ввод интервала)

case '1':

system("cls");

system("echo ----------------------------------------------------------");

printf("Введите интервал поиска:");

printf("\nA:\t");scanf("%lf",&A);

printf("B:\t");scanf("%lf",&B);

if (A==B || A>=B)

{

printf("\nВведен неверный интервал!\n\n");

system("pause");

exit(1);

}

system("cls");

break;

//case '2' (ввод коэффициэнтов)

case '2':

system("cls");

system("echo ----------------------------------------------------------");

printf("Введите коэффициэнт при X^5:\t");scanf("%lf",&a0);

printf("\nВведите коэффициэнт при X^4:\t");scanf("%lf",&a1);

printf("\nВведите коэффициэнт при X^3:\t");scanf("%lf",&a2);

printf("\nВведите коэффициэнт при X^2:\t");scanf("%lf",&a3);

printf("\nВведите коэффициэнт при X:\t");scanf("%lf",&a4);

printf("\nВведите коэффициэнт C:\t\t");scanf("%lf",&a5);

system("cls");

break;

//case '3' (ввод точности)

case '3':

system("cls");

system("echo ----------------------------------------------------------");

printf("Введите точность:\t");scanf("%lf",&t);

if (t<0.000001)

{

printf("\nВведена неверная точность!\n\n");

system("pause");

exit(1);

}

mx=dihotomy(A,B,-1,a0,a1,a2,a3,a4,a5,t);

mn=dihotomy(A,B,1,a0,a1,a2,a3,a4,a5,t);

system("cls");

break;

//case '4' (вывод ответа на экран)

case '4':

system("cls");

system("echo ----------------------------------------------------------");

printf("Интервал:");

out("\t(%lg,",A);out("%lg)\n\n",B);

printf("Точность:\t");

out("%lf\n\n",t);

printf("Ответ:\n\n");

out("MAX(x)=\t%lg\n",func(mx,a0,a1,a2,a3,a4,a5));out("x=\t%lg\n\n",mx);

out("MIN(x)=\t%lg\n",func(mn,a0,a1,a2,a3,a4,a5));out("x2=\t%lg",mn);

getch();

system("cls");

break;

//case 'e' (exit - выход)

case 'e':

printf("\n\nДля выхода из программы нажмите любую клавишу . . .");

getch();

exit(1);

break;

}

}

}

//-------------------------------------------------------------------

void menu()

{

system("echo ----------------------------------------------------------");

system("echo Кнопка 1 - Ввод интервала");

system("echo Кнопка 2 - Ввод коэффициэнтов");

system("echo Кнопка 3 - Ввод точности");

system("echo Кнопка 4 - Вывод ответа на экран");

system("echo ----------------------------------------------------------");

system("echo Кнопка e - Выход");

system("echo ----------------------------------------------------------");

}

//-------------------------------------------------------------------

void out(const char *format,double value)

{

printf(format,value);

}

//-------------------------------------------------------------------

double func(double x,double a0,double a1,double a2,double a3,double a4,double a5) //F(x)

{

return (a0*x*x*x*x*x + a1*x*x*x*x + a2*x*x*x + a3*x*x + a4*x + a5);

}

//-------------------------------------------------------------------

double dihotomy(double A, double B, int m,double a0,double a1,double a2,double a3,double a4,double a5,double t) //дихотомия

{

double L=abs(B-A);

double xn=(A+B)/2;

while (L>t)

{

double fn=m*func(xn,a0,a1,a2,a3,a4,a5);

double x1=A+L/4;

double x2=B-L/4;

double f1=m*func(x1,a0,a1,a2,a3,a4,a5);

double f2=m*func(x2,a0,a1,a2,a3,a4,a5);

if(f1<fn)

{

B=xn;

xn=x1;

L=B-A;

}

else if(f2<fn)

{

A=xn;

xn=x2;

L=B-A;

}

else if((f1>=fn) && (f2>=fn))

{

A=x1;

B=x2;

L=B-A;

}

}

return xn;

}

Библиографический список

  1. Бахвалов Н.С., Жидков Н.П., Кобельков Г.Г. Численные методы. — 8-е изд. — М.: Лаборатория Базовых Знаний, 2000.

  2. Ананий В. Левитин Глава 11. Преодоление ограничений: Метод деления пополам. — М.: «Вильямс», 2006. — С. 476-480.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]