Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

КУРСОВОЙ ПРОЕКТ Формирование массива комплексной функции Пояснительная записка Выполни

Работа добавлена на сайт samzan.net:


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

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

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

УНИВЕРСИТЕТ

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

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

КУРСОВОЙ ПРОЕКТ

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

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

 Выполнил:

  ст-т гр. Р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;}

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

function varargout = mag(varargin)

gui_Singleton = 1;

gui_State = struct('gui_Name',       mfilename, ...

                  'gui_Singleton',  gui_Singleton, ...

                  'gui_OpeningFcn', @mag_OpeningFcn, ...

                  'gui_OutputFcn',  @mag_OutputFcn, ...

                  'gui_LayoutFcn',  [] , ...

                  'gui_Callback',   []);

if nargin & isstr(varargin{1})

   gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

   [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

   gui_mainfcn(gui_State, varargin{:});

end

function mag_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

guidata(hObject, handles);

function varargout = mag_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;

function edits_CreateFcn(hObject, eventdata, handles)

if ispc

   set(hObject,'BackgroundColor','white');

else

   set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function edits_Callback(hObject, eventdata, handles)

function editL_CreateFcn(hObject, eventdata, handles)

if ispc

   set(hObject,'BackgroundColor','white');

else

   set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function editL_Callback(hObject, eventdata, handles)

hL=handles.editL; str=get(hL,'string'); L=str2num(str);

hs=handles.edits;

if L<0

set(hs,'string','L doljno bit >=0'); set(hL,'string',0);

else

set(hs,'string','L vvedeno verno');

end

function editZ_CreateFcn(hObject, eventdata, handles)

if ispc

   set(hObject,'BackgroundColor','white');

else

   set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function editZ_Callback(hObject, eventdata, handles)

hZ=handles.editZ; str=get(hZ,'string'); Z=str2num(str);

hs=handles.edits;

if Z<0

set(hs,'string','Z doljno bit >=0'); set(hZ,'string',0);

else

set(hs,'string','Z vvedeno verno');

end

function editY1_CreateFcn(hObject, eventdata, handles)

if ispc

   set(hObject,'BackgroundColor','white');

else

   set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function editY1_Callback(hObject, eventdata, handles)

function editY2_CreateFcn(hObject, eventdata, handles)

if ispc

   set(hObject,'BackgroundColor','white');

else

   set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function editY2_Callback(hObject, eventdata, handles)

hY1=handles.editY1; str=get(hY1,'string'); Y1=str2num(str);

hY2=handles.editY2; str=get(hY2,'string'); Y2=str2num(str);

hs=handles.edits; hdY=handles.editdY;

if Y2<Y1

hs=handles.edits; set(hs,'string','Y2 doljno bit >=Y1');

set(hY2,'string',num2str(Y1));

else

if Y1==Y2

set(hs,'string','vichislenie dla odnoy tochki'); set(hdY,'string',0);

else

X=(Y2-Y1)*0.001; set(hs,'string','optimalniy shag ukazan v dY');

set(hdY,'string',num2str(X));

end

end

function editdY_CreateFcn(hObject, eventdata, handles)

if ispc

   set(hObject,'BackgroundColor','white');

else

   set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));

end

function editdY_Callback(hObject, eventdata, handles)

hdY=handles.editdY; str=get(hdY,'string'); dY=str2num(str);

hY1=handles.editY1; str=get(hY1,'string'); Y1=str2num(str);

hY2=handles.editY2; str=get(hY2,'string'); Y2=str2num(str);

hs=handles.edits; X=(Y2-Y1)*0.001;

if Y1==Y2

   if dY==0

   set(hs,'string','mojno stroit grafiki');

   else

   set(hs,'string','vichislenie dla odnoy tochki');  set(hdY,'string',0);

   end

else

   if X<dY

   set(hs,'string','ne vichislayetsa, shag velik');  set(hdY,'string',num2str(X));

   else

   set(hs,'string','mojno stroit grafiki');

   end

end

function lfc_Callback(hObject, eventdata, handles)

hL=handles.editL; hZ=handles.editZ; hY1=handles.editY1;

hY2=handles.editY2; hdY=handles.editdY;

load p.txt;

set(hL,'string',num2str(p(1))); set(hZ,'string',num2str(p(2)));

set(hY1,'string',num2str(p(3))); set(hY2,'string',num2str(p(4)));

set(hdY,'string',num2str(p(5)));

function pushbutton2_Callback(hObject, eventdata, handles)

load f.txt; load p.txt;

Y1=p(3); Y2=p(4); dY=p(5);

hax1=handles.axes1; hax2=handles.axes2; hax3=handles.axes3;

if dY==0

   dY=0.000001;

end

axes(hax1); cla; i=1; Y=Y1;

while Y<=Y2

plot(Y,f(i,2)); hold on; i=i+1; Y=Y+dY;

end

axes(hax2); cla; i=1; Y=Y1;

while Y<=Y2

plot(Y,f(i,3)); hold on; i=i+1; Y=Y+dY;

end

axes(hax3); cla; i=1; Y=Y1;

while Y<=Y2

plot(Y,f(i,4)); hold on; i=i+1; Y=Y+dY;

end

function pushbutton3_Callback(hObject, eventdata, handles)

hL=handles.editL; str=get(hL,'string'); L=str2num(str);

hZ=handles.editZ; hY1=handles.editY1; hY2=handles.editY2;

hdY=handles.editdY; hax4=handles.axes4; hax5=handles.axes5;

hax6=handles.axes6; str=get(hZ,'string'); Z=str2num(str);

str=get(hY1,'string'); Y1=str2num(str); str=get(hY2,'string');

Y2=str2num(str); str=get(hdY,'string'); dY=str2num(str); X=L/2;

if dY==0

   dY=0.000001;

end

axes(hax4); cla; Y=Y1;

while Y<=Y2

plot(Y,Hx(L,X,Y,Z)); hold on; Y=Y+dY;

end

axes(hax5); cla; Y=Y1;

while Y<=Y2

plot(Y,Hy(L,X,Y,Z)); hold on; Y=Y+dY;

end

axes(hax6); cla; Y=Y1;

while Y<=Y2

plot(Y,Hz(L,X,Y,Z)); hold on; Y=Y+dY;

end

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

function otv=R(Y1,Z);

otv=(Y1^2+Z^2)^0.5; 

function otv=R1(L,X,Y1);

otv=(LmX(L,X)^2+Y1^2)^0.5;

function otv=R2(L,X,Y1);

otv=(LpX(L,X)^2+Y1^2).^0.5;

function otv=LmX(L,X);

otv=L-X;   

function otv=LpX(L,X);

otv=L+X;           

function otv=R1pZ(L,X,Y1,Z);

otv=(R1(L,X,Y1)^2+Z^2)^0.5;

function otv=R2pX(L,X,Y1);

otv=(R2(L,X,Y1)^2+X^2)^0.5;

function otv=R2pZ(L,X,Y1,Z);

otv=(R2(L,X,Y1)^2+(Z^2))^0.5;

function otv=LpXpR(L,X,Y1,Z);

otv=(LpX(L,X)^2+R(Y1,Z)^2)^0.5;

function otv=LmXpR(L,X,Y1,Z);

otv=(LmX(L,X)^2+R(Y1,Z)^2)^0.5;  

function otv=Hx(L,X,Y1,Z);

otv=(-1)/(4*3.14)*(Y1/(R1(L,X,Y1)^2)*(1-Z/R1pZ(L,X,Y1,Z))-Y1/(R2(L,X,Y1)^2)*(1-Z/R2pX(L,X,Y1)));

function otv=Hy(L,X,Y1,Z);

otv=1/(4*3.14)*(Z/(R(Y1,Z)^2)*(LpX(L,X)/LpXpR(L,X,Y1,Z)-LmX(L,X)/LmXpR(L,X,Y1,Z))-(LmX(L,X)/(R1(L,X,Y1)^2)*

(1-Z/R1pZ(L,X,Y1,Z))+LpX(L,X)/(R2(L,X,Y1)^2)*( 1-Z/R2pZ(L,X,Y1,Z))));

function otv=Hz(L,X,Y1,Z);

otv=Y1/(4*3.14*(R(Y1,Z)^2))*(LpX(L,X)/LpXpR(L,X,Y1,Z)+

LmX(L,X)/LmXpR(L,X,Y1,Z));




1. и Андрей Матвеевич или Меркурьевич Матвеев 1701 1739
2. Тема 5 Государство как институт политической системы общества
3. тема норм які визначають основи і принципи кримінальної відповідальності встановлюють які суспільнонебез.
4. Організація і шляхи підвищення економічної ефективності виробництва зерна.html
5. К началу 30 годов международная обстановка изменилась
6. Географические особенности реки Ни
7. ЗНАКОМСТВО С ПРАВИЛАМИ БЕЗОПАСНОСТИ Проводят- воспитатель по физической культуре Черникова Е
8. тема Применение гражданского законодательства
9. Реферат- История физики- строение материи
10. Терроризм в современном мире
11. 20 г ФЕДЕРАЛЬНЫЙ ГОСУДАРСТВЕННЫЙ ОБРАЗОВАТЕЛЬНЫЙ СТАНДАРТ НАЧАЛЬНОГО П
12. Культура ногайского народа
13. варианта КС т.е. определяется оптимальная марка ГПА число и схема соединения машин данной марки количеств
14. тематична статистика АВТОРЕФЕРАТ дисертації на здобуття наукового ступеня
15. минутки 10минутки часовики или Dily использовать в работе начинающим да и не только им
16. психолог Белянушкина Елена Михайловна Рузаевка 2010 О ПРИНЦИПАХ И МЕТОДАХ РАБОТЫ ПСИХОЛОГА С ОДА
17. Банк России как инструмент регулирования и развития валютного рынка
18. справочник содержит разделы по психологии социальной психологии труда психотерапии психодиагностике па
19. Братья Алопеусы
20. тема подразделяется на отрасли права каждая из которых представляет собой относительно самостоятельную час