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

Федеральное агентство по образованию

Государственно образовательное учреждение высшего профессионального образования

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

УНИВЕРСИТЕТ

Институт радиоэлектроники

Кафедра «Радиофизика»

Курсовой проект

Формирование массива комплексной функции

Пояснительная записка

Выполнил:

ст-т гр. Р45-1

И.Н. Сенотрусов

Проверил:

А.В. Изотов

Красноярск 2006

Содержание

  1. Задание …………………………………………………………………….…..3

  2. Введение ……………………………………………………………………….4

  3. Описание ………………………………………………………………………5

  4. Текст программы на языке С++….…………………………………………...8

  5. Текст библиотеки на языке С++….………………………………………….11

  6. Текст файл-программы на языке Math lab.………………………………....13

  7. Тексты файл-функций на языке Math lab…………………………………...19

  8. Блок-схема………………………………………………………………….....21

  9. Заключение …………...……………………………………………………....22

  10. Список литературы ...……………………………………………………...…23

Задание

Прямолинейный заземленный кабель длиной с токомрасположен по осиx над горизонтальной однородной средой, начало координат совпадает с серединой кабеля. Магнитное поле кабеля имеет три составляющих:

Рассчитать ,,и построить зависимости отпри постоянных,.

Введение

В данном задании необходимо составить программу в среде С++, которая вычисляет значения трех составляющих магнитного поля кабеля и выводит результаты вычислений в файл. В другой файл записываются данные, по которым производилось вычисления. В системе Math lab необходимо составить файл-программу которая создает интерфейсное окно, где производиться вывод графики по результатам вычислений произведенных в С++. А также вычисления по введенным данным средствами Math lab, и вывод графиков по проведенным вычислениям. В ходе написания программы в среде С++ и файл-программы в среде Math lab необходимо использовать принципы модульного программирования.

Описание (теория)

Программа в С++.

В самом начале программы кроме стандартных библиотек используется

библиотека под названием function_good.h. В ней содержаться функции с помощью которых вычисляются значения других функций из этой же библиотеки, а также функция, выводящая на экран данные, полученные для визуального контроля пользователем за ходом вычислений. В ходе разработки программы было решено разбить вычисления на этапы, каждый из которых обусловлен новой функцией. Это сделано для того, чтобы программа работала надежно в любых условиях. А также в любой момент можно было бы добавить в код программы и библиотеку более совершенные алгоритмы, позволяющие ускорить и улучшить работу программы. В самой программе производиться только ввод данных, печать результатов вычислений в файл. А также печать в файл данных, по которым производятся вычисления. Интерфейс предъявляет ограничения на введенные данные. Эти ограничения необходимы для стыковки результатов вычислений с физическим и практическим смыслом задачи. Также в программе используются смысловые ветвления. Программа не одинаково, но адекватно реагирует на введенные данные. Программа помогает пользователю ввести корректные данные.

Теперь подробнее о том, как программа работает. В этой программе тип основной функции double. Можно было выбрать любой другой тип. Они все в данной программе равнозначны, т.к в функция не имеет входных аргументов передаваемых извне и не возвращает их. Глобальные переменные являются переменными типа double, т.к. этот тип обладает диапазоном и размером достаточным для проведения вычислений. Диапазон значений типа double 1.7е–308…1.7е+308, при размере 8 байт. В ходе написания программы было решено не использовать циклы с постусловием для упрощения понимания работы программы. Принцип работы использованных циклов заключается в том, что переменной, которая участвует в организации работы цикла, присваивается значение, позволяющие циклу сработать первый раз. И если пользователь введет некорректные данные, программа сообщит об этом. Цикл будет продолжать работу, пока пользователь не введет корректные данные. При их вводе выполниться оператор, следующий за циклом. Принцип цикла схож с постусловие. Т.к. “программа сначала делает, а потом думает” в обоих случаях. Во всей в программе для проверки правильности ввода используются такие циклы.

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

Программа просто не начнет делать никаких вычислений при вводе некорректных данных. Особое внимание нужно уделить тому, что программа умеет не только вычислять значения магнитного поля для промежутка изменений Y, но и для одного значения, используя при этом один и тот же цикл. Для организации такого цикла в самом начале программы переменной шага присваивается значение равное десяти в минус восьмой степени. Если вычисления нужно произвести в точке, то значение шага записанного в код программы не меняется. Иначе, т.е. для вычисления промежутка переменной присваивается новое введенное с клавиатуры значение.

Шаг, записанный в код программы, выбран именно таким, что при выводе два последних знака не записываются в файл. Т.е. в программе записано, что шаг равен десяти в минус восьмой, а выводиться, что шаг равен нулю. Этот прием сокращает размеры кода программы.

Для того чтобы пользователь мог, не закрывая окна программы, ввести новые данные и произвести новые вычисления, используется вышеописанный цикл. Выход осуществиться при присвоении переменой, участвующей в работе цикла, значения, соответствующие выходу из цикла.

В самом начале библиотеки function_good.h определены те же переменные, что и основной программе. Отличие лишь в том, что они определены как внешние. Все функции библиотеки возвращают значения типа double, используя для их вычисления переменные типа double и другие функции также типа double. При вычислении функций библиотеки используется стандартная функция sqrt(х). Она возвращает квадратный корень числа х. А также используется функция pow(x,y) для возведения х в степень у.

Файл-программа в Math lab.

Файл-программа работает примерно также как и программа в С++. Например она для своей работы использует такой же набор функций как и программа в С++, использует такие же ограничения по вводу данных. Отличие заключается в том, что файл-программа использует не один файл, в котором записаны все нужные функции, а набор файл-функций. Есть еще некоторые отличия. Во-первых, файл-программа по заданию должна создавать интерфейсное окно с осями для построения графиков и областями динамического текста. Во-вторых, введение данных осуществляется не в строке, как в программе написанной в С++, а определенных областях динамического текста. Проверка правильности ввода организована не как в С++. Алгоритм проверки сделан таким образом, что при введении некорректных данных в строке подсказок выводиться сообщение об ошибке и как эту ошибку исправить. А неверно введенные данные исправляются автоматически. Внимание нужно уделить тому, что программа при вводе данных о пределах вычислений предлагает пользователю возможные варианты выбора шага, занося соответствующий промежутку шаг в поле динамическое текста. Также есть возможность загрузить из файла данные, использованные для расчетов в программе написанной на языке С++. Тем самым файл-программа облегчает пользователю ввод данных. После ввода каждого значения необходимо нажимать Enter для того, что программа оценила правильность ввода. После заполнения последнего поля, содержащего информацию о шаге, и нажатия Enter в поле динамического текста подсказки выводится сообщение о том, что пользователю можно делать дальше.

Если все данные введены верно, то также как и в С++ произведутся вычисления. По результатам вычислений построятся графики. Запустить вычисления нужно нажатием кнопки mathlab. Организация расчетов в файл-программе как выше говорилось сделана также как и в программе, написанной на языке С++, отличие лишь в синтаксисе. Это сделано для облегчения понимания работы файл-программы. После произведения расчетов строятся графики. Построение графиков по результатам вычислений произведенных в программе(на языке С++), осуществляется нажатием на кнопку с++. Т.е. файл-программа открывает файл с уже рассчитанными значениями и строит по ним графики.

При сравнении полученных графиков видно, что точность при их построении достигнута достаточно высокая.

Текст программы на языке С++

#include <iostream.h>

#include <math.h>

#include <stdio.h>

#include "function_good.h"

double main()

{

double L, Z, Y1, Y2, X, dY; FILE *f,*p; char s;

s='y';

while (s!='n')

{L=-1; Z=-1; dY=0.00000001;

while (L<0)

{cout << "\n vvedite L: "; cin >> L;

if (L<0)

{cout << "\n L doljno bit' bolshe libo ravno 0";

cout << "\n";}}

while (Z<0)

{cout << "\n vvedite Z: "; cin >> Z;

if (Z<0)

{cout << "\n Z doljno bit' bolshe libo ravno 0";

cout << "\n";}}

Y2=0; Y1=1;

while (Y1>Y2)

{cout << "\n vvedite Y1: "; cin >> Y1; cout << "\n vvedite Y2: "; cin >> Y2;

if (Y1>Y2) cout << "\n vvedeno nevernoe Y1. Y1 doljno bit < Y2"; }

if (Y1!=Y2)

{cout << "\n vvedite pogreshnost-shag dY: "; cin >> dY;

X=(Y2-Y1)*0.001;

while (X<dY)

{cout << "\n vichisleniye s plohoy tochnostiyu ne proizvodatsa";

cout << "\n v dannom sluchae visokay tochnost pri shage= " << X <<" "; cin >> dY;}}

else

{cout << "\n vichisleniye dlya odnoy tochki, t.k. vvedeno Y1=Y2 ";

cout << "\n";}

X=L/2;

p=fopen("p.txt","w");

fprintf(p,"%12.6f %12.6f %12.6f %12.6f %12.6f",L,Z,Y1,Y2,dY);

printer(L,X,Y1,Z,dY,Y2); printf("\n");

f=fopen("f.txt","w");

while (Y1<=Y2)

{fprintf(f,"\n %12.6f %12.6f %12.6f %12.6f",Y1,Hx(L,X,Y1,Z),Hy(L,X,Y1,Z),Hz(L,X,Y1,Z));

Y1=Y1+dY; }

cout <<"\n prodoljit y,n"; cin >> s;}

return 0;}

Текст библиотеки на языке С++

extern double L, Z, Y1, Y2, X, dY;

double R(double Y1,double Z)

{return sqrt(pow(Y1,2)+pow(Z,2));}

double R1(double L,double X, double Y1)

{return sqrt(pow(L-X,2)+pow(Y1,2));}

double R2(double L,double X, double Y1)

{return sqrt(pow(L+X,2)+pow(Y1,2));}

double LpX(double L,double X)

{return L+X;}

double LmX(double L,double X)

{return L-X;}

double LmXpR(double L,double X,double Y1,double Z)

{return sqrt(pow(LmX(L,X),2)+pow(R(Y1,Z),2)); }

double LpXpR(double L,double X,double Y1, double Z)

{return sqrt(pow(LpX(L,X),2)+pow(R(Y1,Z),2));}

double R1pZ(double L,double X, double Y1,double Z)

{return sqrt(pow(R1(L,X,Y1),2)+pow(Z,2));}

double R2pZ(double L,double X, double Y1,double Z)

{return sqrt(pow(R2(L,X,Y1),2)+pow(Z,2));}

double R2pX(double L,double X, double Y1)

{return sqrt(pow(R2(L,X,Y1),2)+pow(X,2));}

double Hz(double L,double X,double Y1,double Z)

{return Y1/(4*3.14*pow(R(Y1,Z),2)) *

( LpX(L,X)/LpXpR(L,X,Y1,Z) + LmX(L,X)/LmXpR(L,X,Y1,Z) );}

double Hx(double L,double X,double Y1,double Z)

{return -1/(4*3.14) *

(Y1/pow(R1(L,X,Y1),2) * ( 1-Z/R1pZ(L,X,Y1,Z) ) –

Y1/pow(R2(L,X,Y1),2) * ( 1-Z/R2pX(L,X,Y1) ) );}

double Hy(double L,double X,double Y1,double Z)

{return 1/(4*3.14) * (Z/pow(R(Y1,Z),2) *

( LpX(L,X)/LpXpR(L,X,Y1,Z)-LmX(L,X)/LmXpR(L,X,Y1,Z) )

-( LmX(L,X)/pow(R1(L,X,Y1),2) * ( 1-Z/R1pZ(L,X,Y1,Z) ) +

LpX(L,X)/pow(R2(L,X,Y1),2) * ( 1-Z/R2pZ(L,X,Y1,Z) ) ) );}

char printer(double L,double X,double Y1,double Z, double dY, double Y2)

{char p,u;

u=printf("\n Y ")+printf(" Hx ")

+printf(" Hy ")+printf(" Hz ");

while (Y1<=Y2)

{p=printf("\n%12.6f ", Y1 )

+printf("%12.6f ", Hx(L,X,Y1,Z))

+printf("%12.6f ", Hy(L,X,Y1,Z))

+printf("%12.6f ", Hz(L,X,Y1,Z) );

Y1=Y1+dY;}

return p=u+p;}

Соседние файлы в папке Информатика_1