Спутниковая связь

  • Вид работы:
    Реферат
  • Предмет:
    История техники
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    28,12 kb
  • Опубликовано:
    2009-01-12
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Спутниковая связь

Министерство науки и образования Российской Федерации

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра радиоэлектроники и защиты информации (РЗИ)




Курсовая работа на тему

«Программа решения уравнения методом половинного деления»


Выполнил: студент 1А2 группы

Леконцев Д.Р.

Проверил: аспирант кафедры РЗИ

Чечулин С.О.





Томск 2013

Оглавление

1.Цель работы………………………………………………………………4

2.Задание……………………………………………………………………5

3.Исходные данные………………………………………………………..6

4.Описание метода решения задачи, программы и используемых      алгоритмов………………………………………………………………….7

         4.1.Структура проекта………………………………………………7

         4.2.Алгоритм работы проекта……………………………………....7

         4.3 Решение уравнения методом половинного деления……..…....7

         4.4.Точное решение уравнения...………………………………...…9

         4.5.Абсолютная и относительная погрешности вычислений….....9

5.Описание методики тестирования программы………………..………10

6.Руководство пользователя по работе с программой………….………13

7.Блок-схема программы…………………………………………………14

8.Распечатка текста программы………………………………………….16

Выводы по работе……………………...………………………………….21

Список используемой литературы………..……………….……………..22

Тут будет лист с тех. заданием           1. Цель работы

Изучить теоретический материал для  создания программы  решения уравнения методом половинного деления. Разработать алгоритм решения поставленной задачи, разработать программу на языке Си, протестировать созданную программу, устранить ошибки, выявленные на этапе тестирования.

2. Задание

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

3. Исходные данные

Число уравнений 3

1.  ;

2.  ;

3.

Коэффициенты a, b, c вещественные числа задаются с клавиатуры. Погрешность вычисления корня, границы интервала поиска корня – вещественные числа, задаются с клавиатуры.

4. Описание метода решения задачи, программы и используемых алгоритмов

4.1.Структура проекта

Проект состоит из файлов:

1. Pol_del.cpp – главный элемент проекта;

2. graphic.cpp – отображение графиков функций

4.2.Алгоритм работы проекта

При запуске программы пользователю предоставляется ввести данные с клавиатуры.

Исходные данные к программе:

gr1 и gr2 – пределы интегрирования (вещественные числа)

a, b, c – коэффициенты в уравнениях (вещественные числа)

n – число делений (натуральное число).

При вводе пользователем данных проверяется их корректность. При обнаружении ошибки, повторяется процесс ввода.

Далее для каждого из 3х уравнений вычисляются и отображаются на экран:

1.  Приближенное значение корня, вычисленное методом половинного деления;

2.  Точное значение корня;

3.  Погрешность вычисления;

Затем отображается выбранный график и процесс вычисления корня.

4.3.Решение уравнения методом половинного деления

Метод половинного деления — это метод численного решения нелинейных уравнений вида f(x)=0, заключающийся в делении исходного интервала до тех пор пока корень уравнения не будет найден.  Идея метода проста: пусть функция непрерывна на отрезке [gr1,gr2] и |gr2-gr1|>eps, делим отрезок [gr1,gr2] пополам. Получим точку x=(gr1+gr2)/2 и два отрезка [gr1,x] и [x,gr2]. Если F(x)=0, то x и есть искомый корень. Если нет, то из двух полученных отрезков [gr1,x] и [x,gr2] надо выбрать такой [gr1’,gr2’], что F(gr1’)*F(gr2’)<0, то есть [gr1’,gr2’]=[gr1,x], если F(gr1)*F(x)<0 или [gr1’,gr2’]= [gr1,x],  если F(gr2)*F(x)<0. Теперь новый отрезок делим пополам и ищем середину отрезка и так далее. Для того чтобы найти приближенное значение корня с точность eps>0, необходимо остановить процесс половинного деления на шаге n, на котором |gr2-gr1|<eps, и вычислить x=(gr1+gr2)/2. Половина этого отрезка и будет приближенным корнем уравнения.

Исходное уравнение содержится в функции:

F1(float x)

Тогда функция решения уравнения  методом половинного деления имеет вид:

while(fabs(gr2-gr1)>eps){

n++;

x=(gr1+gr2)/2;

f1=F1(x);

f2=F1(gr2);

if(fabs(f1)<eps)

{break;}

if (f2*f1<0)

{gr1=x;}

else

{gr2=x;}

}

x=(gr2+gr1)/2;

Где a, b, c – коэффициенты уравнения, gr1,gr2 – интервал, n – количество делений,eps-точность вычисления корня.

4.4.Точное решение уравнения

Точное решение уравнения вычисляется стандартным способом: для первого уравнения с помощью теоремы Вието-Кардано, а для второго и третьего с помощью выражения корня через коэффициенты уравнения.

4.5.Абсолютная и относительная погрешность вычисления

Абсолютная погрешность вычисления находится как модуль разности между точным и приближенным решением.

А относительной погрешностью приближённого числа называется отношение абсолютной погрешности приближённого числа к самому этому числу в процентном соотношении.

Так в нашем случае

fabs(x – x1)– абсолютная погрешность;

fabs((x-x1)/x1)*100– относительная погрешность.

Где x – приближенное решение уравнения (методом половинного деления), x1 – точное решение уравнения.

5.Описание методики тестирования программы

Протестируем на корректное вычисление корня.

Для первого уравнения:

Как видим погрешность вычислений довольно небольшая, что говорит о том, что программа работает правильно.

Для второго уравнения:

Для третьего уравнения:

Рассмотрим работу программы при некорректном вводе данных:

1.   Неверный выбор вида функции


2.   Попытка ввода символов для численного значения:

Аналогично работает тестирование для остальных численных значений

3. Попытка ввода не натурального числа делений


Это основные тесты для программы. Программа прошла успешное тестирование, как на корректную работу, так и на корректное вычисление корня.

6.Руководство пользователя по работе с программой.

При запуске программы предоставляется выбор одной из трех функций.

При вводе данных необходимо учесть, что:

1.  Границы интервала (gr1,gr2) являются вещественными числами;

2.  Коэффициенты в уравнениях  (a, b, c) являются вещественными числами;

3.  Число делений (n_max) - натуральное число.

При нарушении этих требований, программа может закрыться и ввод данных необходимо повторить.

После корректного ввода данных будет отображены для заданных значений:

1.  Значение корня, вычисленного методом половинного деления;

2.  Точное значение корня;

3.  Абсолютная погрешность вычисления;

4.  Относительная погрешность вычисления.

Если данная работа была для Вас полезна, то вы можете поблагодарить автора!

Реквизиты Сбербанк:4276 6400 1230 1216

Для связи VK: https://vk.com/red_de

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

 

 


8.Распечатка текста программы

Комментарии к файлу хранятся в исходнике.

Pol_del.cpp – главный файл проекта

#include <conio.h>

#include <math.h>

#include <stdio.h>

#include <locale.h>

#include <windows.h>

#include <graphics.h>

const int X0=400,Y0=300,k=100;

const float pi=3.14;

int n=0,v,n_max,n1;

float a,b,c,gr1,gr2,eps;

float q,r,Q,R,m,A,B,R1,Q1;

float x,f1,f2,fm,x1,g,s,f,pog,pog1,j,t;

float F1(float x){

return a*x*x*x+b*x+c;

}

float F2(float x){

return a*sin(x+b)+c;

}

float F3(float x){

return a*log(fabs(x+b))+c;

}

float sign(float x){

    if(x==0)return 0;

    if(x>0) return 1;

    else return -1;

}

#include"graphic.cpp"

main() {

setlocale(LC_CTYPE,"Russian");     

printf("Выберите уравнение:\n1)y=a*x*x*x+b*x+c\n2)y=a*sin(x+b)+c\n3)y=a*ln|x+b|+c\nВвод:");

scanf("%d",&v);

switch(v)

{

         case 1:break;

         case 2:break;

         case 3:break;

         default:printf("Введен неверное значение! Программа закрывается!\n");

         system("pause");

         exit(0);

         }

fflush(stdin);

while(!scanf("%f",&eps)){

                         while(getchar() != '\n');

                         printf("Ошибка ввода!Попробуйте снова!\n Введите точность eps:");

                         }

if(eps<0||eps==0){

printf("Точность не может быть отрицательной или равной нулю!Программа закрывается!\n");

system("pause");

exit(0);

}

fflush(stdin);

printf("Введите границы:\ngr1=");

while(!scanf("%f",&gr1)){

                         while(getchar() != '\n');

                         printf("Ошибка ввода!Попробуйте снова!\ngr1=");

                         }

fflush(stdin);

printf("gr2=");

while(!scanf("%f",&gr2)){

                         while(getchar() != '\n');

                         printf("Ошибка ввода!Попробуйте снова!\ngr2=");

                         }

if(gr1>gr2){

            s=gr1;

            g=gr2;

            gr1=g;

            gr2=s;

            }

g=gr1;

s=gr2;

fflush(stdin);

printf("Введите коэффициенты:\na=");

while(!scanf("%f",&a)){

                       while(getchar() != '\n');

                       printf("Ошибка ввода!Попробуйте снова!\na=:");

                       }

fflush(stdin);

printf("b=");

while(!scanf("%f",&b)){

                       while(getchar() != '\n');

                       printf("Ошибка ввода!Попробуйте снова!\nb=");

                       }

fflush(stdin);

printf("c=");

while(!scanf("%f",&c)){

                       while(getchar() != '\n');

                       printf("Ошибка ввода!Попробуйте снова!\nc=:");

                       }

fflush(stdin);

printf("Введите максимальное число делений:");

while(!scanf("%d",&n_max)){

                           while(getchar() != '\n');

                           printf("Ошибка ввода!Попробуйте снова!\n Введите максимальное число делений:");

                           }

                           if(n_max<0||n_max==0){

                                       printf("Количество делений не может быть вещественным числом или меньше, либо равным нулю!\nПрограмма закрывается!\n");

                                       system("pause");

                                       exit(0);

                                       }

fflush(stdin);

switch(v)

{case 1:

while(fabs(gr2-gr1)>eps){

n++;

x=(gr1+gr2)/2;

f1=F1(x);

f2=F1(gr2);

if(fabs(f1)<eps)

{break;}

if (f2*f1<0)

{gr1=x;}

{gr2=x;}

}

if(a==0&&b!=0){

               x1=-c/b;

               break;

               }

if(a!=0){

           q=b/a;

           r=c/a;

           Q=-(3*q)/9;

           R=(27*r)/54;

           Q1=pow(Q,3);

           R1=pow(R,2);

           if(R1<Q1)

           {m=acos(R/sqrt(Q1))/3;

           x1=-2*sqrt(Q)*cos(m);

           }

           if(R1>=Q1)

           {A=-sign(R)*pow(fabs(R)+sqrt(R1-Q1),0.33);

           if(A!=0)

           {B=Q/A;

           }

           if(A==0)

           {B=0;

           }

            x1=(A+B);

            }

            }

if(!((g<=x1)&&(s>=x1))||a==0&&b==0){

                            printf("В интервале [%.3f;%.3f] корня нет!\n",g,s);

                            system("pause");

                            exit(0);

                            }

x=(gr2+gr1)/2;

fm=F1(x);

break;

case 2:

while(fabs(gr2-gr1)>eps){

n++;                      

x=(gr1+gr2)/2;

f1=F2(x);

f2=F2(gr2);

if(fabs(f1)<eps)

{break;}

if (f2*f1<0)

{gr1=x;}

else

{gr2=x;}

}

if(c/a>1||c/a<-1){

          printf("В интервале [%.3f;%.3f] корня нет!\n",g,s);

                            system("pause");

                            exit(0);

                            }

if(!((g<=x1)&&(s>=x1))||a==0){

                              printf("В интервале [%.3f;%.3f] корня нет!\n",g,s);

                              system("pause");

                              exit(0);

                              }

x=(gr2+gr1)/2;

for(n1=0;n1<=1000;n1++)

{

j=-asin(c/a)-b-pi*n1;

if(((x-0.03*x)<=j)&&((x+0.03*x)>=j)){

                                          x1=j;

                                          }

                                          }

for(n1=0;n1<=1000;n1++){

j=-asin(c/a)-b+pi*n1;

if(((x-0.03*x)<=j)&&((x+0.03*x)>=j)){

                           }

                           }

fm=F2(x);

break;

           case 3:

while(fabs(gr2-gr1)>eps){

n++;

x=(gr1+gr2)/2;

f1=F3(x);

f2=F3(gr2);

if(fabs(f1)<eps)

{break;}                        

if (f2*f1<0)

{gr1=x;}

else

{gr2=x;}

}

x1=pow(M_E,(-c/a))-b;

if(!((g<=x1)&&(s>=x1))||a==0){

                            printf("В интервале [%.3f;%.3f] корня нет!\n",g,s);

                            system("pause");

                            exit(0);

                            }

if(gr2+b<0){

            printf("В интервале [%f;%f] корня нет!\n",g,s);

system("pause");

exit(0);

}                           

x=(gr2+gr1)/2;

fm=F3(x);

break;

}

pog1=fabs(x-x1);

if(x1>x){

         pog=fabs((x-x1)/x1)*100;

         }

if(x==0&&x1==0){

                pog=0;

                }

else{

     pog=fabs((x1-x)/x)*100;

     }

if(n>n_max){

              printf("За %d шаг(ов) корень не найден.Продолжаем?\n1)Да\n2)Нет\nВвод:",n_max);

              while(!scanf("%d",&t)){

              while(getchar() != '\n');

              printf("Ошибка ввода!Попробуйте снова!\nВвод:");

              }

              if(t==1){

                printf("Приближенное x=%.3f\nF(x)=%.3f\nКоличество делений n=%d \nТочное x=%.3f\nАбсолютная погрешность=%.3f\nОтносительная погрешность=%.3f%%\n",x,fm,n,x1,pog1,pog);

                system("pause");

                }

              if(t==2){

              printf("Корень не подсчитан!Программа закрывается!\n");

              system("pause");

              exit(0);

              }      

              else{

              printf("Неверный ввод!Программа закрывается!\n");

              system("pause");

              exit(0);

              }

              }

else{

printf("Приближенное x=%.3f\nF(x)=%.3f\nКоличество делений n=%d \nТочное x=%.3f\nАбсолютная погрешность=%.3f\nОтносительная погрешность=%.3f%%\n",x,fm,n,x1,pog1,pog);

system("pause");

}

initwindow(800,600);

Axes();

Plot();

closegraph();

}
graphic.cpp – отображение графиков функций и процесс вычисления корня

 

float ScreenX(float x){

return(x-g)/(s-g)*getmaxx();

}

float ScreenY(float y){//ïåðåâîä y â êîîðäèíàòû ýêðàíà

      float y_min,y_max;

      y_min=-(600-Y0)/k;

      y_max=Y0/k;

    return getmaxy() - (y-y_min)/(y_max-y_min)*getmaxy();

    }

void Point(float x,float y,int color){

     float xe,ye;

     xe=ScreenX(x);

     ye=ScreenY(y);

     if(xe>=0&&xe<800&&ye>=0&&ye<600)

     putpixel(xe,ye,color);

     }  

void Plot(){

     float x,h,x_min,x_max;

     h=0.0001;//øàã

     for(x=g;x<=s;x+=h)

     switch(v)

     {

     case 1:

     Point(x,F1(x),RED);

     break;

     case 2:

     Point(x,F2(x),RED);

     break;

     case 3:

     Point(x,F3(x),RED);

     break;

     }

     }

void Axes()

    setcolor(8);

     line(400,0,400,599);

     line(0,300,799,300);

     }

Выводы по работе

Изучен теоретический материал  для  создания программы для решения уравнения методом половинного деления. Разработан алгоритм решения поставленной задачи, разработана и протестирована программа на языке Си, выявленные ошибки в ходе тестирования устранены, контрольное тестирование ошибок не показала. Изучен и применен теоретический материал для работы с графикой на языке Cи.

Список используемой литературы


1. MachineLearning.ru. http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D0%B4%D0%B8%D1%85%D0%BE%D1%82%D0%BE%D0%BC%D0%B8%D0%B8 . Интернет ресурс.

2. math.semestr.ru.

 http://math.semestr.ru/optim/dichotomy.php. Интернет ресурс.

3.  Мудров А.Е “Численные методы на языках Basic, Pascal, Fortrun”.

Похожие работы на - Спутниковая связь

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!