Текст программы с комментариями 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Текст программы с комментариями



function [znak]=sgn(a)

if a<0

znak=-1;

elseif a>0

znak=1;

else

znak=0;

end

end

Функция VvodIshodnDannih описанная ниже, обеспечивает считывание значений исходных данных из соответствующих «окон» ввода в интерфейсе, показанном выше на рис.2.2.2.

Для окон ввода (элементов типа Edit Text) предусмотрены тэги – обозначения внутри текста программы, заданные при создании визуального интерфейса. Как видно из текста функции VvodIshodnDannih, k1 считывается, как описано в строке k1=str2double(get(handles.edit1,'String'));, из окна интерфейса (элемента типа Edit Text) с тэгом edit1, тэг был указан при создании визуального интерфейса в «Инспекторе свойств» (Property Inspector). Аналогично, легко определить из текста функции VvodIshodnDannih тэги остальных окон ввода (элементов типа Edit Text). Это edit1, …, edit14 (как видно, нумерация идет подряд), а также edit34, edit35, edit52.

 Функция VvodIshodnDannih считывает исходные данные как строку символов из текстовых окон интерфейса, преобразует их в число функцией str2double и присваивает переменным получившиеся значения.

function VvodIshodnDannih(hObject, eventdata, handles)

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

k1=str2double(get(handles.edit1,'String'));

k2=str2double(get(handles.edit2,'String'));

k3=str2double(get(handles.edit3,'String'));

k4=str2double(get(handles.edit4,'String'));

k5=str2double(get(handles.edit5,'String'));

Rho=str2double(get(handles.edit6,'String'));

Hg1=str2double(get(handles.edit7,'String'));

Hg2=str2double(get(handles.edit8,'String'));

Pn=1000*str2double(get(handles.edit9,'String'));

P1=1000*str2double(get(handles.edit10,'String'));

P2=1000*str2double(get(handles.edit11,'String'));

P3=1000*str2double(get(handles.edit12,'String'));

P4=1000*str2double(get(handles.edit13,'String'));

Hp1=str2double(get(handles.edit14,'String'));

Hp2=str2double(get(handles.edit34,'String'));

T=str2double(get(handles.edit35,'String'));

Radius=str2double(get(handles.edit52,'String'));

S=Radius*Radius*3.14;

end

Функция VivodArgumentovNaEkran, описанная ниже, обеспечивает вывод на экран, то есть в соответствующие окна вывода (элементы типа Edit Text), которые легко определить из текста функции. Как видно из строк S=sprintf('%g',k1); и затем set(handles.edit1,'String',S);, исходная величина k1 выводится в окно вывода (элемент типа Edit Text) с тэгом edit1. Аналогично легко определить, что переменные выводятся в окна с тэгами edit1, …, edit14, подряд пронумерованными, и затем edit34, edit35, edit52, то есть те же самые, которые служат для ввода исходной информации, и в соответствии с пояснениями (названиями вводимых параметров), написанными на панели интерфейса (рис.2.2.2) рядом с окнами ввода исходных значений.

function VivodArgumentovNaEkran(hObject, eventdata, handles)

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

R=sqrt(S/3.14);  

%vivod argumentov na ekran   

S=sprintf('%g',k1);

set(handles.edit1,'String',S);

S=sprintf('%g',k2);

set(handles.edit2,'String',S);

S=sprintf('%g',k3);

set(handles.edit3,'String',S);

S=sprintf('%g',k4);

set(handles.edit4,'String',S);

S=sprintf('%g',k5);

set(handles.edit5,'String',S);

S=sprintf('%g',Rho);

set(handles.edit6,'String',S);

S=sprintf('%g',Hg1);

set(handles.edit7,'String',S);

S=sprintf('%g',Hg2);

set(handles.edit8,'String',S);

S=sprintf('%g',Pn/1000);

set(handles.edit9,'String',S);

S=sprintf('%g',P1/1000);

set(handles.edit10,'String',S);

S=sprintf('%g',P2/1000);

set(handles.edit11,'String',S);

S=sprintf('%g',P3/1000);

set(handles.edit12,'String',S);

S=sprintf('%g',P4/1000);

set(handles.edit13,'String',S);

S=sprintf('%g',Hp1);

set(handles.edit14,'String',S);

S=sprintf('%g',Hp2);

set(handles.edit34,'String',S);

S=sprintf('%g',T);

set(handles.edit35,'String',S);

S=sprintf('%g',R);

set(handles.edit52,'String',S);

 end

Функция ReshitZadachu имеет центральное (наиглавнейшее) значение в ходе решения поставленной задачи (об отыскании результатов исходя из известных начальных данных). Функция ReshitZadachu получает в качестве аргумента функции вектор VectorArg который содержит, как видно из текста функции, все основные исходные данные, последовательно расположенные как элементы вектора. Функция ReshitZadachu возвращает (ее возвращаемым значением является) вектор результатов VectorRes, который, как видно из текста функции, содержит переменные, которые в дальнейшем другими функциями будут выводиться в качестве результатов в окнах интерфейса (рис.2.2.2) и сохраняться в файл (ниже будет описано).

Функция ReshitZadachu получает массив чисел VectorArg и решает задачу, используя описанные внутри нее другие функции.

function [VectorRes]=ReshitZadachu(VectorArg,hObject,eventdata,handles)

k1=VectorArg(1); k2=VectorArg(2); k3=VectorArg(3); k4=VectorArg(4); k5=VectorArg(5); Rho=VectorArg(6);

Hg1=VectorArg(7); Hg2=VectorArg(8); Pn=VectorArg(9); P1=VectorArg(10); P2=VectorArg(11);

P3=VectorArg(12); P4=VectorArg(13); Hp1=VectorArg(14); Hp2=VectorArg(15); T=VectorArg(16); S=VectorArg(17);

H1=Hp1; H2=Hp2;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P7=funP7(H1)

           P7=Hg1*Pn/(Hg1-H1);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P5=funP5(H1)

          P5=funP7(H1)+Rho*9.81*H1;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P8=funP8(H2)

   P8=Pn*(Hg2/(Hg2-H2));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P6=funP6(H2)

   P6=funP8(H2)+Rho*9.81*H2;       

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v1=funV1(H1)

   v1=k1*sqrt(abs(P1-funP5(H1)))*sgn(P1-funP5(H1));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v3=funV3(H1)

   v3=k3*sqrt(abs(funP5(H1)-P3))*sgn(funP5(H1)-P3);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v5=funV5(H1,H2)

   v5=k5*sgn(funP5(H1)-funP6(H2))*sqrt(abs(funP5(H1)-funP6(H2)));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Функция difurH1 содержит дифференциальное уравнение (18*) в конечно-разностной форме:

function dH1=difurH1(H1,H2,T)       

   dH1=(funV1(H1)-funV3(H1)-funV5(H1,H2))/S;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v2=funV2(H2)

   v2=k2*sqrt(abs(P2-funP6(H2)))*sgn(P2-funP6(H2));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v4=funV4(H2)

    v4=k4*sqrt(abs(funP6(H2)-P4))*sgn(funP6(H2)-P4);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Функция difurH2 содержит дифференциальное уравнение (19*) в конечно-разностной форме:

function dH2=difurH2(H1,H2,T)

    dH2=(funV2(H2)+funV5(H1,H2)-funV4(H2))/S;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Функция systDifUr содержит систему дифференциальных уравнений:

function dH=systDifUr(T,H)

   dH=zeros(2,1);

   dH(2)=difurH2(H(1),H(2),T);

   dH(1)=difurH1(H(1),H(2),T);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Функция uravnenije обращается к функции MATLAB ode45, которая решает систему дифференциальных уравнений systDifUr методом Рунге–Кутта 4 или 5 порядка при краевых ограничениях [0, T ] по Т и создает массив значений по Т и массив значений по Н, содержащий два столбца (для Н 1 и для Н 2), после чего строится график Н (Т) для Н 1 и Н 2:

function [Tmas,Hmas]=uravnenije(H1,H2,T)       

   [Tmas,Hmas]=ode45(@systDifUr,[0 T],[H1 H2]);

   plot(Tmas,Hmas,'-k');

   grid;

   xlabel(' Time(s) ');

   ylabel(' H.liquid#1&#2(m) ');

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [VectorRes]=findVectorRes(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1,H2,T,S)

   P7=Hg1*(Pn/(Hg1-H1));

   P5=P7+Rho*9.81*H1;

   v1=k1*sqrt(abs(P1-P5))*sgn(P1-P5);

   v3=k3*sqrt(abs(P5-P3))*sgn(P5-P3);

   P8=Pn*(Hg2/(Hg2-H2));

   P6=P8+Rho*9.81*H2;

   v2=k2*sqrt(abs(P2-P6))*sgn(P2-P6);

   v4=k4*sqrt(abs(P6-P4))*sgn(P6-P4);

   v5=k5*sgn(P5-P6)*sqrt(abs(P5-P6));

   VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2];

end   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Вызов функции uravnenije описанной выше:

[Tmas,Hmas]=uravnenije(H1,H2,T);

n=0; m=0;

[n,m]=size(Hmas);

Переменным Н 1 и Н 2 присваиваются значения последних элементов соответствующих столбцов массива Нmas, что эквивалентно значениям уровней жидкости в последний момент времени (правый край графика зависимости Н (Т)):

H1=Hmas(n,1);

H2=Hmas(n,2);

Вызов функции findVectorRes описанной выше. Она находит значения переменных для вывода на экран и готовые результаты помещает в вектор VectorRes:

[VectorRes]=findVectorRes(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1,H2,T,S);   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

end

Функция ReshitZadachuG аналогична описанной выше функции ReshitZadachu, однако в отличие от нее ReshitZadachuG предназначена для многократного вызова при расчете точек, например, для трехмерного графика (рис.2.2.3).

function [VectorRes]=ReshitZadachuG(VectorArg)

k1=VectorArg(1); k2=VectorArg(2); k3=VectorArg(3); k4=VectorArg(4); k5=VectorArg(5); Rho=VectorArg(6);

Hg1=VectorArg(7); Hg2=VectorArg(8); Pn=VectorArg(9); P1=VectorArg(10); P2=VectorArg(11);

P3=VectorArg(12); P4=VectorArg(13); Hp1=VectorArg(14); Hp2=VectorArg(15); T=VectorArg(16); S=VectorArg(17);

H1=Hp1; H2=Hp2;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P7=funP7(H1)

           P7=Hg1*Pn/(Hg1-H1);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P5=funP5(H1)

          P5=funP7(H1)+Rho*9.81*H1;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P8=funP8(H2)

   P8=Pn*(Hg2/(Hg2-H2));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P6=funP6(H2)

   P6=funP8(H2)+Rho*9.81*H2;       

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v1=funV1(H1)

   v1=k1*sqrt(abs(P1-funP5(H1)))*sgn(P1-funP5(H1));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v3=funV3(H1)

   v3=k3*sqrt(abs(funP5(H1)-P3))*sgn(funP5(H1)-P3);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v5=funV5(H1,H2)

   v5=k5*sgn(funP5(H1)-funP6(H2))*sqrt(abs(funP5(H1)-funP6(H2)));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Функция difurH1 содержит дифференциальное уравнение (18*) в конечно-разностной форме:

function dH1=difurH1(H1,H2,T)       

   dH1=(funV1(H1)-funV3(H1)-funV5(H1,H2))/S;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v2=funV2(H2)

   v2=k2*sqrt(abs(P2-funP6(H2)))*sgn(P2-funP6(H2));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v4=funV4(H2)

    v4=k4*sqrt(abs(funP6(H2)-P4))*sgn(funP6(H2)-P4);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Функция difurH2 содержит дифференциальное уравнение (19*) в конечно-разностной форме:

function dH2=difurH2(H1,H2,T)

    dH2=(funV2(H2)+funV5(H1,H2)-funV4(H2))/S;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Функция systDifUr содержит систему дифференциальных уравнений:

function dH=systDifUr(T,H)

   dH=zeros(2,1);

   dH(2)=difurH2(H(1),H(2),T);

   dH(1)=difurH1(H(1),H(2),T);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Функция uravnenije обращается к функции MATLAB ode45, которая решает систему дифференциальных уравнений systDifUr методом Рунге–Кутта 4 или 5 порядка при краевых ограничениях [0, T ] по Т и создает массив значений по Т и массив значений по Н, содержащий два столбца (для Н 1 и для Н 2), после чего строится график Н (Т) для Н 1 и Н 2:

function [Tmas,Hmas]=uravnenije(H1,H2,T)       

   [Tmas,Hmas]=ode45(@systDifUr,[0 T],[H1 H2]);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [VectorRes]=findVectorRes(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1,H2,T,S)

   P7=Hg1*(Pn/(Hg1-H1));

   P5=P7+Rho*9.81*H1;

   v1=k1*sqrt(abs(P1-P5))*sgn(P1-P5);

   v3=k3*sqrt(abs(P5-P3))*sgn(P5-P3);

   P8=Pn*(Hg2/(Hg2-H2));

   P6=P8+Rho*9.81*H2;

   v2=k2*sqrt(abs(P2-P6))*sgn(P2-P6);

   v4=k4*sqrt(abs(P6-P4))*sgn(P6-P4);

   v5=k5*sgn(P5-P6)*sqrt(abs(P5-P6));

   VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2];

end   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Вызов функции uravnenije описанной выше:

[Tmas,Hmas]=uravnenije(H1,H2,T);

n=0; m=0;

[n,m]=size(Hmas);

Переменным Н 1 и Н 2 присваиваются значения последних элементов соответствующих столбцов массива Нmas, что эквивалентно значениям уровней жидкости в последний момент времени (правый край графика зависимости Н (Т)):

H1=Hmas(n,1);

H2=Hmas(n,2);

Вызов функции findVectorRes описанной выше. Она находит значения переменных для вывода на экран и готовые результаты помещает в вектор VectorRes:

[VectorRes]=findVectorRes(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1,H2,T,S);   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

end

Функция VivodResultNaEkran выводит на экран значения переменных в соответствующие текстовые окна интерфейса. Функция VivodResultNaEkran выводит результаты вычислений в окна вывода на панели «Результаты вычислений» (рис.2.2.2) с тэгами edit15, …, edit25, то есть пронумерованными подряд. Вывод происходит в окна в соответствии с подписями рядом с ними (рис.2.2.2) с названиями выводимых расчетных параметров (результатов вычислений).

function VivodResultNaEkran(hObject, eventdata, handles)

global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2;  

%vivod resultatov na ekran 

S=sprintf('%g',v1);

set(handles.edit15,'String',S);

S=sprintf('%g',v2);

set(handles.edit16,'String',S);

S=sprintf('%g',v3);

set(handles.edit17,'String',S);

S=sprintf('%g',v4);

set(handles.edit18,'String',S);

S=sprintf('%g',v5);

set(handles.edit19,'String',S);

S=sprintf('%g',P5/1000);

set(handles.edit20,'String',S);

S=sprintf('%g',P6/1000);

set(handles.edit21,'String',S);

S=sprintf('%g',P7/1000);

set(handles.edit22,'String',S);

S=sprintf('%g',P8/1000);

set(handles.edit23,'String',S);

S=sprintf('%g',H1);

set(handles.edit24,'String',S);

S=sprintf('%g',H2);

set(handles.edit25,'String',S);

end

 Функция PostrGrafic строит график: Функция PostrGrafic строит график. Как видно из теста функции global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;, она использует имя (порядковый номер подписанный у соответствующего окна в интерфейсе) NameArg аргумента (отображаемого по горизонтальной оси), использует имя (порядковый номер подписанный у соответствующего окна в интерфейсе) NameVar зависимой переменной (отображаемой по вертикальной оси), шкалу по горизонтальной оси от значения LeftNameVar до значения RightNameVar с шагом StepGr (шаг отображается в разметке горизонтальной оси и в шаге между точками графика).

Кроме того, как видно из текста plot(k1Array,v1Array,'o-');, функция PostrGrafic строит график. Затем, как видно из текста TextVectorArg=[' Koef#1 ',' Koef#2 ',' Koef#3 ',' Koef#4 ',' Koef#5 ',' Rho(kg/m3) ',' H.#1(m) ',' H.#2(m) ',' P0gas(Pa) ',' Pin#1(Pa) ',' Pin#2(Pa) ','Pout#1(Pa) ','Pout#2(Pa) ',' Hliqu#1(m) ',' Hliqu#2(m) ',' Time(s) ',' Radius(m) ']; TextVectorRes=[' Stream#1(kg/s) ','Stream#2(kg/s) ','Stream#3(kg/s) ','Stream#4(kg/s) ','Stream#5(kg/s) ',' P.liqu#1(Pa) ',' P.liqu#2(Pa)  ',' P.gas#1(Pa) ',' P.gas#2(Pa) ',' H.liquid#1(m) ',' H.liquid#2(m) '];, функция подготавливает подписи к горизонтальной оси и к вертикальной оси и размещает их в соответствующих двух массивах. В каждом из массивов подписи из одинакового количества символов, включая пробелы. Последняя подпись в каждом массиве на один символ длиннее.

Затем, как видно из текста xLlabel=' ';

for i=((NameArg-1)*12+1):(NameArg*12+1)

   xLlabel=strcat(xLlabel,TextVectorArg(i));

end

yLlabel=' ';

for i=((NameVar-1)*15+1):(NameVar*16+1)

   yLlabel=strcat(yLlabel,TextVectorRes(i));

end

xlabel(xLlabel);

ylabel(yLlabel); функция подготавливает подпись к горизонтальной оси, учитывая, что длина подписи принимается двенадцать символов (последняя подпись в массиве делается на один знак длиннее). Функция выбирает подпись - элемент массива с номером NameArg.

Также функция PostrGrafic подготавливает подпись к вертикальной оси, учитывая, что длина подписи принимается пятнадцать символов (последняя подпись в массиве делается на один знак длиннее). Функция выбирает подпись - элемент массива с номером NameVar.

Затем функция PostrGrafic подписывает оси подготовленными для этого подписями.

Как видно из текста Array_3D=0; zLlabel=0; NumberSteps_3D=0; LeftNameArg_3D=0; StepGr_3D=0; RightNameArg_3D=0; функция PostrGrafic присваивает значения равные нулю переменным, связанным с построением трехмерного графика. Это обеспечивает согласованную работу с некоторыми другими функциями (будут описаны ниже).

function PostrGrafic(hObject, eventdata, handles)

global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;

global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D;

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

 if (NameArg>8)&&(NameArg<14)

   LeftNameVar=LeftNameVar*1000;

   StepGr=StepGr*1000;

   RightNameVar=RightNameVar*1000;

end

VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1,Hp2,T,S];

VectorArg(NameArg)=LeftNameVar;

k1Array(1)=LeftNameVar;

[VectorRes]=ReshitZadachuG(VectorArg);

v1Array(1)=VectorRes(NameVar);

for i=2:NumberSteps+1

   k1Array(i)=k1Array(i-1)+StepGr;

   VectorArg(NameArg)=k1Array(i);

   [VectorRes]=ReshitZadachuG(VectorArg);

  v1Array(i)=VectorRes(NameVar);

end   

plot(k1Array,v1Array,'o-');

set(gca,'XGrid','on');

set(gca,'YGrid','on');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%podpisi k osyam

TextVectorArg=[' Koef#1 ',' Koef#2 ',' Koef#3 ',' Koef#4 ',' Koef#5 ',' Rho(kg/m3) ',' H.#1(m) ',' H.#2(m) ',' P0gas(Pa) ',' Pin#1(Pa) ',' Pin#2(Pa) ','Pout#1(Pa) ','Pout#2(Pa) ',' Hliqu#1(m) ',' Hliqu#2(m) ',' Time(s) ',' Radius(m) '];

TextVectorRes=[' Stream#1(kg/s) ','Stream#2(kg/s) ','Stream#3(kg/s) ','Stream#4(kg/s) ','Stream#5(kg/s) ',' P.liqu#1(Pa) ',' P.liqu#2(Pa) ',' P.gas#1(Pa) ',' P.gas#2(Pa) ',' H.liquid#1(m) ',' H.liquid#2(m) '];

xLlabel=' ';

for i=((NameArg-1)*12+1):(NameArg*12+1)

   xLlabel=strcat(xLlabel,TextVectorArg(i));

end

yLlabel=' ';

for i=((NameVar-1)*15+1):(NameVar*15+1)

   yLlabel=strcat(yLlabel,TextVectorRes(i));

end

xlabel(xLlabel);

ylabel(yLlabel);

Array_3D=0;

zLlabel=0;

NumberSteps_3D=0;

LeftNameArg_3D=0;

StepGr_3D=0;

RightNameArg_3D=0;

end

Функция PostrGrafic_3D строит трехмерный график. Функция использует для третьей оси (второй оси в горизонтальной плоскости) значение NameArg_3D как имя (номер указанный в подписях к элементам интерфейса) переменной по третьей оси (второй аргумент при построении графика зависимости от двух аргументов), шкалу по третьей оси от LeftNameArg_3D до RightNameArg_3D с шагом StepGr_3D. В конце работы функция присваивает v1Array=0; для совместимости с некоторыми другими функциями (будут описаны ниже)

function PostrGrafic_3D(hObject, eventdata, handles)

global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;

global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D;

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

 if (NameArg>8)&&(NameArg<14)

   LeftNameVar=LeftNameVar*1000;

   StepGr=StepGr*1000;

   RightNameVar=RightNameVar*1000;

end

if (NameArg_3D>8)&&(NameArg_3D<14)

   LeftNameArg_3D=LeftNameArg_3D*1000;

   StepGr_3D=StepGr_3D*1000;

   RightNameArg_3D=RightNameArg_3D*1000;

end

VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1,Hp2,T,S];

for i=1:NumberSteps+1

   if i==1

       k1Array(i)=LeftNameVar; 

   else

       k1Array(i)=k1Array(i-1)+StepGr;           

   end %if

   VectorArg(NameArg)=k1Array(i); 

   for j=1:NumberSteps_3D+1

       if j==1

           z1Array(j)=LeftNameArg_3D; 

       else

           z1Array(j)=z1Array(j-1)+StepGr_3D;               

       end %if

       VectorArg(NameArg_3D)=z1Array(j);

       [VectorRes]=ReshitZadachuG(VectorArg);

       Array_3D(j,i)=VectorRes(NameVar);

   end %for j

end %for i

[x,y]=meshgrid(LeftNameVar:StepGr:RightNameVar,LeftNameArg_3D:StepGr_3D:RightNameArg_3D);

mesh(x,y,Array_3D);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%podpisi k osyam

TextVectorArg=[' Koef#1 ',' Koef#2 ',' Koef#3 ',' Koef#4 ',' Koef#5 ',' Rho(kg/m3) ',' H.#1(m) ',' H.#2(m) ',' P0gas(Pa) ',' Pin#1(Pa) ',' Pin#2(Pa) ','Pout#1(Pa) ','Pout#2(Pa) ',' Hliqu#1(m) ',' Hliqu#2(m) ',' Time(s) ',' Radius(m) '];

TextVectorRes=[' Stream#1(kg/s) ','Stream#2(kg/s) ','Stream#3(kg/s) ','Stream#4(kg/s) ','Stream#5(kg/s) ',' P.liqu#1(Pa) ',' P.liqu#2(Pa) ',' P.gas#1(Pa) ',' P.gas#2(Pa) ',' H.liquid#1(m) ',' H.liquid#2(m) '];

xLlabel=' ';

for i=((NameArg-1)*12+1):(NameArg*12+1)

   xLlabel=strcat(xLlabel,TextVectorArg(i));

end

yLlabel=' ';

for i=((NameArg_3D-1)*12+1):(NameArg_3D*12+1)

   yLlabel=strcat(yLlabel,TextVectorArg(i));

end

zLlabel=' ';

for i=((NameVar-1)*15+1):(NameVar*15+1)

   zLlabel=strcat(zLlabel,TextVectorRes(i));

end

xlabel(xLlabel);

ylabel(yLlabel);

zlabel(zLlabel);

v1Array=0;

end

Функция pushbutton13_Callback вызывается при нажатии кнопки интерфейса с надписью «ПОСТРОИТЬ ГРАФИК». Необходимо присвоить этой кнопке тэг pushbutton13 при создании интерфейса. Функция считывает значения переменных из окон интерфейса. NameVar из окна «номер зависимой переменной» с тэгом edit31, LeftNameVar из окна «минимальное значение аргумента» с тэгом edit29, RightNameVar из окна «максимальное значение аргумента» с тэгом edit30, NameArg из окна «номер аргумента» с тэгом edit28, StepGr из окна «шаг аргумента» с тэгом edit32, а также с панели для построения трехмерного графика «Объемный график» считывает NameArg_3D из окна «номер аргумента» с тэгом edit53, LeftNameArg_3D из окна «минимальный» с тэгом edit54, RightNameArg_3D из окна «максимальный» с тэгом edit56, StepGr_3D из окна «шаг» с тэгом edit55. Необходимо присвоить этим окнам соответствующие тэги.

Если NameArg_3D равен нулю, то вызывается функция PostrGrafic для построения плоского графика. По умолчанию в окне панели для построения трехмерного графика «Объемный график» NameArg_3D «номер аргумента» (рис.2.2.2) стоит ноль. Его надо указать при создании интерфейса как значение ‘String’.

Если NameArg_3D не равен нулю, то вызывается функция PostrGrafic_3D для построения трехмерного графика.

function pushbutton13_Callback(hObject, eventdata, handles)

global PG;

if PG==1       

else

   clear global;

end %if

global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;

global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D;

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2;

NameVar=str2double(get(handles.edit31,'String'));

LeftNameVar=str2double(get(handles.edit29,'String'));

RightNameVar=str2double(get(handles.edit30,'String'));

NameArg=str2double(get(handles.edit28,'String'));

StepGr=str2double(get(handles.edit32,'String'));

VvodIshodnDannih(hObject, eventdata, handles);

NumberSteps=round((RightNameVar-LeftNameVar)/StepGr);

NameArg_3D=str2double(get(handles.edit53,'String'));

if NameArg_3D==0

   PostrGrafic(hObject, eventdata, handles);

else

LeftNameArg_3D=str2double(get(handles.edit54,'String'));

RightNameArg_3D=str2double(get(handles.edit56,'String'));

   StepGr_3D=str2double(get(handles.edit55,'String'));

   NumberSteps_3D=round((RightNameArg_3D-LeftNameArg_3D)/StepGr_3D);

   PostrGrafic_3D(hObject, eventdata, handles);

end %if

end

Функция pushbutton3_Callback вызывается кнопкой «ВЫЧИСЛИТЬ». Необходимо этой кнопке присвоить тэг pushbutton3. Она обеспечивает вызов функции VvodIshodnDannih то есть ввод исходных данных из окон интерфейса, вызов функции ReshitZadachu то есть вычисление, и вызов функции VivodResultNaEkran то есть вывод результатов в окна интерфейса.

function pushbutton3_Callback(hObject, eventdata, handles)

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2;

%global Tmas Hmas n m;

VvodIshodnDannih(hObject, eventdata, handles);

VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1,Hp2,T,S];

[VectorRes]=ReshitZadachu(VectorArg,hObject,eventdata,handles);

v1=VectorRes(1); v2=VectorRes(2); v3=VectorRes(3);

v4=VectorRes(4); v5=VectorRes(5); P5=VectorRes(6);

P6=VectorRes(7); P7=VectorRes(8); P8=VectorRes(9);

H1=VectorRes(10); H2=VectorRes(11);

VivodResultNaEkran(hObject, eventdata, handles);

end

Функция pushbutton2_Callback вызывается кнопкой «ВЫЧИСЛИТЬ И СОХРАНИТЬ», необходимо присвоить этой кнопке тэг pushbutton2, она обеспечивает вычисление результатов и сохранение в файл.

function pushbutton2_Callback(hObject, eventdata, handles)

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2;

global Tmas Hmas n m;

%Vichislit resultati

pushbutton3_Callback(hObject, eventdata, handles);

%otkrit fail dlya zapisi

[f,p]=uiputfile('C:\MATLAB701\work\S283Res.txt','Окно выбора');

KudaZapisat=strcat(p,f);

f=fopen(KudaZapisat,'wt');

%gotovim dannije dlja avtomaticheskogo schitivanija

fprintf(f,'%d\t%d\n',n,m);

for i=1:n

   for j=1:m

       fprintf(f,'%g\t',Hmas(i,j));           

   end

   fprintf(f,'\n');

end

for i=1:n

   fprintf(f,'%g\t',Tmas(i));    

end   

fprintf(f,'\n');

VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1,Hp2,T,S];   

VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2];

for i=1:11

   fprintf(f,'%g\t',VectorRes(i));

end

for i=1:17

   fprintf(f,'%g\t',VectorArg(i));

end       

%sohranit v fail resultati vichislenij

fprintf(f,'\nS283_NESTAT_REG_IN_HIDRAVL_SIST_05\n');

fprintf(f,'RESULTATI VICHISLENIY\n');

TextString=strcat(' Stream#1(kg/s) ','Stream#2(kg/s) ','Stream#3(kg/s) ','Stream#4(kg/s) ','Stream#5(kg/s) ',' P.liqu#1(Pa) ',' P.liqu#2(Pa) ',' P.gas#1(Pa) ',' P.gas#2(Pa) ',' H.liquid#1(m) ',' H.liquid#2(m) ');

fprintf(f,TextString);

fprintf(f,'\n');

for i=1:11

   fprintf(f,'%g\t\t\t',VectorRes(i));

end

%sohranit v fail ishodnije argumenti

fprintf(f,'\nARGUMENTI VICHISLENIY\n');

TextString=strcat(' Koef#1 ',' Koef#2 ',' Koef#3 ',' Koef#4 ',' Koef#5 ',' Rho(kg/m3) ',' H.#1(m) ',' H.#2(m) ',' P0gas(Pa) ',' Pin#1(Pa) ',' Pin#2(Pa) ','Pout#1(Pa) ','Pout#2(Pa) ',' Hliqu#1(m) ',' Hliqu#2(m) ',' Time(s) ',' Radius(m) ');

fprintf(f,TextString);

fprintf(f,'\n');

for i=1:10

   fprintf(f,'%g\t\t\t\t',VectorArg(i));

end

fclose(f);

end

Функция pushbutton14_Callback вызывается кнопкой «ОТКРЫТЬ ИЗ ФАЙЛА», необходимо этой кнопке присвоить тэг pushbutton14, функция обеспечивает открытие из файла исходных данных и результатов и вывод их в окна интерфейса.

function pushbutton14_Callback(hObject, eventdata, handles)

clear global;

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2;

global Tmas Hmas n m;

%Otkrit is faila

[f,p]=uigetfile('C:\MATLAB701\work\S283Res*.txt','Окно выбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila

%chitat matricu H(n,m)

n=fscanf(f,'%d',1);

m=fscanf(f,'%d',1); 

Hmas=zeros(n,m);

Tmas=zeros(n,1);

for i=1:n

   for j=1:m

       Hmas(i,j)=fscanf(f,'%g',1);

   end

end       

for i=1:n

   Tmas(i)=fscanf(f,'%g',1);           

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

for i=1:11

   VectorRes(i)=fscanf(f,'%g',1);

end

for i=1:17

   VectorArg(i)=fscanf(f,'%g',1);

       

end

fclose(f);

v1=VectorRes(1); v2=VectorRes(2); v3=VectorRes(3);

v4=VectorRes(4); v5=VectorRes(5); P5=VectorRes(6);

P6=VectorRes(7); P7=VectorRes(8); P8=VectorRes(9);

H1=VectorRes(10); H2=VectorRes(11);

k1=VectorArg(1); k2=VectorArg(2); k3=VectorArg(3); k4=VectorArg(4); k5=VectorArg(5); Rho=VectorArg(6);

Hg1=VectorArg(7); Hg2=VectorArg(8); Pn=VectorArg(9); P1=VectorArg(10); P2=VectorArg(11);

P3=VectorArg(12); P4=VectorArg(13); Hp1=VectorArg(14); Hp2=VectorArg(15); T=VectorArg(16); S=VectorArg(17);

%vivod na ekran

VivodResultNaEkran(hObject, eventdata, handles);

VivodArgumentovNaEkran(hObject, eventdata, handles);  

%postroit grafic

plot(Tmas,Hmas,'-k');

grid;

xlabel('T (seconds)');

ylabel('H (meters)');  

end

Функция pushbutton8_Callback вызывается при нажатии на кнопку «ПОСТРОИТЬ ГРАФИК И СОХРАНИТЬ», необходимо этой кнопке присвоить тэг pushbutton8, функция обеспечивает построение графика и его сохранение в файл.

function pushbutton8_Callback(hObject, eventdata, handles)

global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2;

global Tmas Hmas n m;

global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D;

global PG;

%postroit grafic

PG=1;

pushbutton13_Callback(hObject, eventdata, handles);

PG=0;

%Sohranit grafic v fail

[f,p]=uiputfile('C:\MATLAB701\work\S283Graf.txt','Окно выбора');

KudaZapisat=strcat(p,f);

f=fopen(KudaZapisat,'wt');

if Array_3D==0

   %gotovim dannije dlja avtomaticheskogo chitivanija

   fprintf(f,'%d\t',NumberSteps);

   for i=1:(NumberSteps+1)

       fprintf(f,'%g\t',k1Array(i));

   end

   fprintf(f,'\n');

   for i=1:(NumberSteps+1)

       fprintf(f,'%g\t',v1Array(i));

   end       

   %podpisi k osyam grafica

   fprintf(f,'%s\t%s\n',xLlabel,yLlabel);

else

   %gotovim dannije dlja avtomaticheskogo chitivanija

   NS=0;

   fprintf(f,'%d\n',NS);

fprintf(f,'%d\t%d\t%d\t%d\t%d\t%d\n',LeftNameVar,StepGr,RightNameVar,LeftNameArg_3D,StepGr_3D,RightNameArg_3D);

   fprintf(f,'\n');

   for i=1:(NumberSteps_3D+1)

       for j=1:(NumberSteps+1)           

          fprintf(f,'%g\t',Array_3D(i,j));

       end %for j

       fprintf(f,'\n');

   end

   fprintf(f,'\n');

% %podpisi k osyam grafica

   fprintf(f,'%s\t%s\t%s\n',xLlabel,yLlabel,zLlabel);       

end %if

%zapisivajem argumenti

VvodIshodnDannih(hObject, eventdata, handles);

VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1,Hp2,T,S];

for i=1:17

  fprintf(f,'%g\t',VectorArg(i));

end 

%podpisi k osyam grafica

fprintf(f,'%s\t%s\n',xLlabel,yLlabel);

fclose(f);

end

Функция pushbutton15_Callback вызывается кнопкой «ОТКРЫТЬ ГРАФИК ИЗ ФАЙЛА», необходимо присвоить этой кнопке тэг pushbutton15, функция обеспечивает открытие графика из файла (то есть построение графика) и выводит в окна интерфейса значения исходных данных.

function pushbutton15_Callback(hObject, eventdata, handles)

clear global;

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

%otkrit grafic is faila

[f,p]=uigetfile('C:\MATLAB701\work\S283Graf*.txt','Окно выбора');

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila

NumberSteps=fscanf(f,'%d',1);

if NumberSteps==0

   LeftNameVar=fscanf(f,'%g',1);

   StepGr=fscanf(f,'%g',1);

   RightNameVar=fscanf(f,'%g',1);

   LeftNameArg_3D=fscanf(f,'%g',1);

   StepGr_3D=fscanf(f,'%g',1);

   RightNameArg_3D=fscanf(f,'%g',1);

[x,y]=meshgrid(LeftNameVar:StepGr:RightNameVar,LeftNameArg_3D:StepGr_3D:RightNameArg_3D);

%число столбцов=NumberSteps+1 число строк=NumberSteps_3D+1

   NumberSteps_3D=round((RightNameArg_3D-LeftNameArg_3D)/StepGr_3D);

   NumberSteps=round((RightNameVar-LeftNameVar)/StepGr);

   for i=1:(NumberSteps_3D+1)

       for j=1:(NumberSteps+1)           

          Array_3D(i,j)=fscanf(f,'%g',1);

       end %for j

   end % for i

   %podpisi k osyam grafica

   xLlabel=fscanf(f,'%s',1);

   yLlabel=fscanf(f,'%s',1);

   zLlabel=fscanf(f,'%s',1);

   %stroim grafic

   mesh(x,y,Array_3D);

   xlabel(xLlabel);

   ylabel(yLlabel);

   zlabel(zLlabel);

else

   for i=1:NumberSteps+1

       k1Array(i)=fscanf(f,'%g',1);

   end

   for i=1:NumberSteps+1

       v1Array(i)=fscanf(f,'%g',1);

   end

   %podpisi k osyam grafica

   xLlabel=fscanf(f,'%s',1);

   yLlabel=fscanf(f,'%s',1);

   %stroim grafic

   plot(k1Array,v1Array,'o-');

   set(gca,'XGrid','on');

   set(gca,'YGrid','on'); 

   xlabel(xLlabel);

   ylabel(yLlabel);

end %if

for i=1:17

  VectorArg(i)=fscanf(f,'%g',1);

end 

fclose(f);

k1=VectorArg(1); k2=VectorArg(2); k3=VectorArg(3); k4=VectorArg(4); k5=VectorArg(5); Rho=VectorArg(6);

Hg1=VectorArg(7); Hg2=VectorArg(8); Pn=VectorArg(9); P1=VectorArg(10); P2=VectorArg(11);

P3=VectorArg(12); P4=VectorArg(13); Hp1=VectorArg(14); Hp2=VectorArg(15); T=VectorArg(16); S=VectorArg(17);

%vivod na ekran

VivodArgumentovNaEkran(hObject, eventdata, handles); 

end

Для начинающих освоение МАТЛАБа, можно рекомендовать такую же по содержанию программу, но без визуального интерфейса.

Ниже изложено ее содержание.

Для наиболее начальной стадии изучения МАТЛАБа можно рекомендовать ее выполнить сначала не всю, а только следующие ее части:

ИСХОДНЫЕ ДАННЫЕ

ВЫЧИСЛИТЬ

ВЫВОД РЕЗУЛЬТАТОВ

Ниже будет пояснено, какие несколько функций для этого надо подготовить.

ИСХОДНЫЕ ДАННЫЕ:

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

function DATA

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

k1=1;

k2=1;

k3=1;

k4=1;

k5=1;

Rho=1000;%kg/m3

Hg1=50;%m

Hg2=30;%m

Pn=100; %KPa

P1=550; %KPa

P2=500; %KPa

P3=100; %KPa

P4=100; %KPa

Hp1=10; %m

Hp2=5; %m

T=180; %sec

Radius=20; %m

S=Radius*Radius*3.14; %m2

% perevod is KPa v Pa

Pn=Pn*1000; %Pa

P1=P1*1000; %Pa

P2=P2*1000; %Pa

P3=P3*1000; %Pa

P4=P4*1000; %Pa

end

Функция GLAV_Vichislit_pushbutton3_Callback не связана ни с какими элементами (кнопками) графического интерфейса, так как графического интерфейса нет, но выполняет те же самые задачи, что и раньше (как было описано в предыдущем варианте программы, где был графический интерфейс). Однако, вместо обращения к функции ввода данных из окон графического интерфейса, теперь функция GLAV_Vichislit_pushbutton3_Callback обращается к функции DATA, чтобы получить исходные данные. Объявленные в функции GLAV_Vichislit_pushbutton3_Callback глобальные переменные в результате обращения к функции DATA становятся содержащими те же значения, как одинаковые с ними по названию глобальные переменные в функции DATA.

function GLAV_Vichislit_pushbutton3_Callback

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2;

DATA;

VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1,Hp2,T,S];

[VectorRes]=ReshitZadachu(VectorArg);

v1=VectorRes(1);

v2=VectorRes(2);

v3=VectorRes(3);

v4=VectorRes(4);

v5=VectorRes(5);

P5=VectorRes(6);

P6=VectorRes(7);

P7=VectorRes(8);

P8=VectorRes(9);

H1=VectorRes(10);

H2=VectorRes(11);

VivodArgumentovNaEkran;

VivodResultNaEkran;

end

Функция GLAV_Vichislit вызывает функцию ReshitZadachu, ее тоже необходимо описать:

function [VectorRes]=ReshitZadachu(VectorArg)

k1=VectorArg(1); k2=VectorArg(2); k3=VectorArg(3); k4=VectorArg(4); k5=VectorArg(5); Rho=VectorArg(6);

Hg1=VectorArg(7); Hg2=VectorArg(8); Pn=VectorArg(9); P1=VectorArg(10); P2=VectorArg(11);

P3=VectorArg(12); P4=VectorArg(13); Hp1=VectorArg(14); Hp2=VectorArg(15); T=VectorArg(16); S=VectorArg(17);

H1=Hp1; H2=Hp2;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [znak]=sgn(a)

       if a<0

           znak=-1;

       elseif a>0

           znak=1;

       else

           znak=0;

       end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P7=funP7(H1)

           P7=Hg1*Pn/(Hg1-H1);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P5=funP5(H1)

          P5=funP7(H1)+Rho*9.81*H1;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P8=funP8(H2)

   P8=Pn*(Hg2/(Hg2-H2));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P6=funP6(H2)

   P6=funP8(H2)+Rho*9.81*H2;   

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v1=funV1(H1)

   v1=k1*sqrt(abs(P1-funP5(H1)))*sgn(P1-funP5(H1));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v3=funV3(H1)

   v3=k3*sqrt(abs(funP5(H1)-P3))*sgn(funP5(H1)-P3);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v5=funV5(H1,H2)

   v5=k5*sgn(funP5(H1)-funP6(H2))*sqrt(abs(funP5(H1)-funP6(H2)));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function dH1=difurH1(H1,H2,T)       

   dH1=(funV1(H1)-funV3(H1)-funV5(H1,H2))/S;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v2=funV2(H2)

    v2=k2*sqrt(abs(P2-funP6(H2)))*sgn(P2-funP6(H2));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v4=funV4(H2)

    v4=k4*sqrt(abs(funP6(H2)-P4))*sgn(funP6(H2)-P4);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function dH2=difurH2(H1,H2,T)

    dH2=(funV2(H2)+funV5(H1,H2)-funV4(H2))/S;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function dH=systDifUr(T,H)

   dH=zeros(2,1);

   dH(2)=difurH2(H(1),H(2),T);

   dH(1)=difurH1(H(1),H(2),T);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [Tmas,Hmas]=uravnenije(H1,H2,T)       

   [Tmas,Hmas]=ode45(@systDifUr,[0 T],[H1 H2]);

   plot(Tmas,Hmas,'-k');

   grid;

   xlabel(' Time(s) ');

   ylabel(' H.liquid#1&#2(m) ');

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [VectorRes]=findVectorRes(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1,H2,T,S)

   P7=Hg1*(Pn/(Hg1-H1));

   P5=P7+Rho*9.81*H1;

   v1=k1*sqrt(abs(P1-P5))*sgn(P1-P5);

   v3=k3*sqrt(abs(P5-P3))*sgn(P5-P3);

   P8=Pn*(Hg2/(Hg2-H2));

   P6=P8+Rho*9.81*H2;

   v2=k2*sqrt(abs(P2-P6))*sgn(P2-P6);

   v4=k4*sqrt(abs(P6-P4))*sgn(P6-P4);

   v5=k5*sgn(P5-P6)*sqrt(abs(P5-P6));

   VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2];

end   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[Tmas,Hmas]=uravnenije(H1,H2,T);

n=0; m=0;

[n,m]=size(Hmas);

H1=Hmas(n,1);

H2=Hmas(n,2);

[VectorRes]=findVectorRes(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1,H2,T,S);   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

end

ВЫВОД РЕЗУЛЬТАТОВ: Функция VivodResultNaEkran выводит результаты в Command Window (так как графического интерфейса не предусмотрено).

function VivodResultNaEkran

global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2;  

%vivod resultatov na ekran  

disp('РЕЗУЛЬТАТЫ ВЫЧИСЛЕНИЙ');

disp(['Расход клапана №1 (v1)=' num2str(v1,'%10.2f') ' литр/сек']);

disp(['Расход клапана №2 (v2)=' num2str(v2,'%10.2f') ' литр/сек']);

disp(['Расход клапана №3 (v3)=' num2str(v3,'%10.2f') ' литр/сек']);

disp(['Расход клапана №4 (v4)=' num2str(v4,'%10.2f') ' литр/сек']);

disp(['Расход клапана №5 (v5)=' num2str(v5,'%10.2f') ' литр/сек']);

disp(['Давл жидкости в емк №1 (P5)=' num2str(P5/1000,'%10.2f') ' КПа']);

disp(['Давл жидкости в емк №2 (P6)=' num2str(P6/1000,'%10.2f') ' КПа']);

disp(['Давл газа в емк №1 (P7)=' num2str(P7/1000,'%10.2f') ' КПа']);

disp(['Давл газа в емк №2 (P8)=' num2str(P8/1000,'%10.2f') ' КПа']);

disp(['Высота жидк в емк №1(H1)=' num2str(H1,'%10.2f') ' м']);

disp(['Высота жидк в емк №2(H2)=' num2str(H2,'%10.2f') ' м']);

end

Функция VivodArgumentovNaEkran выводит значения исходных данных в Command Window (так как графического интерфейса не предусмотрено).

function VivodArgumentovNaEkran

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

%vivod argumentov na ekran

disp('ИСХОДНЫЕ ДАННЫЕ');

disp(['Коэф пропускания клапана №1 (k1)=' num2str(k1,'%10.2f') ' относит. ед.']);

disp(['Коэф пропускания клапана №2 (k2)=' num2str(k2,'%10.2f') ' относит. ед.']);

disp(['Коэф пропускания клапана №3 (k3)=' num2str(k3,'%10.2f') ' относит. ед.']);

disp(['Коэф пропускания клапана №4 (k4)=' num2str(k4,'%10.2f') ' относит. ед.']);

disp(['Коэф пропускания клапана №5 (k5)=' num2str(k5,'%10.2f') ' относит. ед.']);

disp(['Плотность (Rho)=' num2str(Rho,'%10.2f') ' кг/м3']);

disp(['Высота емкости №1(Hg1)=' num2str(Hg1,'%10.2f') ' м']);

disp(['Высота емкости №2(Hg2)=' num2str(Hg2,'%10.2f') ' м']);

disp(['Давл газа в пуст емк (Pn)=' num2str(Pn/1000,'%10.2f') ' КПа']);

disp(['Давл на входе №1 (P1)=' num2str(P1/1000,'%10.2f') ' КПа']);

disp(['Давл на входе №2 (P2)=' num2str(P2/1000,'%10.2f') ' КПа']);

disp(['Давл на выходе №1 (P3)=' num2str(P3/1000,'%10.2f') ' КПа']);

disp(['Давл на выходе №2 (P4)=' num2str(P4/1000,'%10.2f') ' КПа']);

disp(['Предполагаемая высота жидк в емк №1(Hp1)=' num2str(Hp1,'%10.2f') ' м']);

disp(['Предполагаемая высота жидк в емк №2(Hp2)=' num2str(Hp2,'%10.2f') ' м']);

disp(['Предполагаемое время(T)=' num2str(T,'%10.2f') ' сек']);

R=sqrt(S/3.14);

disp(['Предполагаемый радиус обеих емкостей (R)=' num2str(R,'%10.2f') ' м']);

end

Для более подробного изучения, следует подготовить нижеследующие функции. Они позволят построить графики – плоские и трехмерные, а также сохранить результаты вычислений и графики в файл и открыть их из файла. Все они не связаны с графическим интерфейсом и для получения исходных данных обращаются к функции DATA, а для вывода значений аргументов и вычисленных результатов – к вышеописанным функциям VivodArgumentovNaEkran и VivodResultNaEkran, выводящим в Command Window.

function [VectorRes]=ReshitZadachuG(VectorArg)

k1=VectorArg(1); k2=VectorArg(2); k3=VectorArg(3); k4=VectorArg(4); k5=VectorArg(5); Rho=VectorArg(6);

Hg1=VectorArg(7); Hg2=VectorArg(8); Pn=VectorArg(9); P1=VectorArg(10); P2=VectorArg(11);

P3=VectorArg(12); P4=VectorArg(13); Hp1=VectorArg(14); Hp2=VectorArg(15); T=VectorArg(16); S=VectorArg(17);

H1=Hp1; H2=Hp2;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [znak]=sgn(a)

       if a<0

           znak=-1;

       elseif a>0

           znak=1;

       else

           znak=0;

       end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P7=funP7(H1)

           P7=Hg1*Pn/(Hg1-H1);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P5=funP5(H1)

          P5=funP7(H1)+Rho*9.81*H1;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P8=funP8(H2)

   P8=Pn*(Hg2/(Hg2-H2));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function P6=funP6(H2)

   P6=funP8(H2)+Rho*9.81*H2;       

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v1=funV1(H1)

   v1=k1*sqrt(abs(P1-funP5(H1)))*sgn(P1-funP5(H1));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v3=funV3(H1)

   v3=k3*sqrt(abs(funP5(H1)-P3))*sgn(funP5(H1)-P3);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  function v5=funV5(H1,H2)

   v5=k5*sgn(funP5(H1)-funP6(H2))*sqrt(abs(funP5(H1)-funP6(H2)));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function dH1=difurH1(H1,H2,T)       

   dH1=(funV1(H1)-funV3(H1)-funV5(H1,H2))/S;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v2=funV2(H2)

   v2=k2*sqrt(abs(P2-funP6(H2)))*sgn(P2-funP6(H2));

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function v4=funV4(H2)

    v4=k4*sqrt(abs(funP6(H2)-P4))*sgn(funP6(H2)-P4);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function dH2=difurH2(H1,H2,T)

    dH2=(funV2(H2)+funV5(H1,H2)-funV4(H2))/S;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function dH=systDifUr(T,H)

   dH=zeros(2,1);

   dH(2)=difurH2(H(1),H(2),T);

   dH(1)=difurH1(H(1),H(2),T);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [Tmas,Hmas]=uravnenije(H1,H2,T)       

   [Tmas,Hmas]=ode45(@systDifUr,[0 T],[H1 H2]);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [VectorRes]=findVectorRes(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1,H2,T,S)

   P7=Hg1*(Pn/(Hg1-H1));

   P5=P7+Rho*9.81*H1;

   v1=k1*sqrt(abs(P1-P5))*sgn(P1-P5);

   v3=k3*sqrt(abs(P5-P3))*sgn(P5-P3);

   P8=Pn*(Hg2/(Hg2-H2));

   P6=P8+Rho*9.81*H2;

   v2=k2*sqrt(abs(P2-P6))*sgn(P2-P6);

   v4=k4*sqrt(abs(P6-P4))*sgn(P6-P4);

   v5=k5*sgn(P5-P6)*sqrt(abs(P5-P6));

   VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2];

end   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[Tmas,Hmas]=uravnenije(H1,H2,T);

n=0; m=0;

[n,m]=size(Hmas);

H1=Hmas(n,1);

H2=Hmas(n,2);

[VectorRes]=findVectorRes(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1,H2,T,S);   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

end

 

function PostrGrafic_3D

global NameVar LeftNameVar RightNameVar NameArg StepGr LeftNameArg_3D StepGr_3D RightNameArg_3D NameArg_3D;

%global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2;

global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D;

global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 Hp2 T S;

if (NameArg>8)&&(NameArg<14)

   LeftNameVar=LeftNameVar*1000;

   StepGr=StepGr*1000;

   RightNameVar=RightNameVar*1000;

end

if (NameArg_3D>8)&&(NameArg_3D<14)

   LeftNameArg_3D=LeftNameArg_3D*1000;

   StepGr_3D=StepGr_3D*1000;

   RightNameArg_3D=RightNameArg_3D*1000;

end

VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1,Hp2,T,S];

for i=1:NumberSteps+1

   if i==1

       k1Array(i)=LeftNameVar; 

   else

       k1Array(i)=k1Array(i-1)+StepGr;           

   end %if

   VectorArg(NameArg)=k1Array(i); 

   for j=1:NumberSteps_3D+1

       if j==1

           z1Array(j)=LeftNameArg_3D; 

       else

           z1Array(j)=z1Array(j-1)+StepGr_3D;               

       end %if

       VectorArg(NameArg_3D)=z1Array(j);

       [VectorRes]=ReshitZadachuG(VectorArg);

       Array_3D(j,i)=VectorRes(NameVar);



Поделиться:


Последнее изменение этой страницы: 2020-10-24; просмотров: 57; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.226.28.197 (0.713 с.)