Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Текст программы с комментариями
Функция sgn возвращает знак числа, преобразованный в логическую переменную znak: function [znak]=sgn(a) if a<0 znak=-1; elseif a>0 znak=1; else znak=0; end end Функция VvodIshodnDannih описанная ниже, обеспечивает считывание введенных пользователем в окна текстового ввода значений исходных данных из соответствующих «окон» ввода в интерфейсе, показанном выше на рис.2.1.3, и присваивает эти значения соответствующим переменным. Функция str2double осуществляет преобразование строки символов в число, например, строка 123 будет преобразована из последовательности отдельных символов 1, 2 и 3 в число 123 и сохранена в возвращаемую функцией переменную числового типа double, то есть вещественное число (десятичная дробь). Функция get(handles.edit1,'String') возвращает строку символов, которая сохранена в строковой переменной под именем String. handles.edit1 используется для того, чтобы обратиться к окну визуального интерфейса. Он содержит окно для ввода/вывода текста типа Edit Text, причем таких окон может быть много. Для окон ввода (элементов типа Edit Text) предусмотрены тэги – обозначения внутри текста программы, заданные при создании визуального интерфейса. Чтобы обратиться к какому-то определенному, используется его индивидуальное название edit1. Таким образом, выражение ааа=str2double(get(handles.edit1,'String')); означает, что из указанного окна текстового ввода будет считана строка символов, которая затем будет преобразована в число, а после этого переменная ааа будет приравнена этому числу. Как видно из текста функции VvodIshodnDannih, переменная k1 считывается, как описано в строке k1=str2double(get(handles.edit1,'String'));, из окна интерфейса (элемента типа Edit Text) с тэгом edit1, тэг был указан при создании визуального интерфейса в «Инспекторе свойств» (Property Inspector). Аналогично, легко определить из текста функции VvodIshodnDannih тэги остальных окон ввода (элементов типа Edit Text). Это edit1, …, edit14. Как видно, нумерация идет подряд. function VvodIshodnDannih(hObject, eventdata, handles) global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1; 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.edit14,'String')); Hp1=str2double(get(handles.edit13,'String')); end Функция VivodArgumentovNaEkran, описанная ниже, обеспечивает вывод переменных (исходных, то есть введенных пользователем), предварительно преобразовав, на экран, то есть в соответствующие окна вывода (элементы типа Edit Text), которые легко определить из текста функции. Она нужна при чтении данных из файла, чтобы обратить внимание пользователя на то, каковы были исходные значения в задаче, сохраненной в файл. Выражение S=sprintf('%g',k1); означает, что переменная k1 будет преобразована в соответствии с определенным форматом (например, формат %g означает, что нужно преобразовать число в десятичную дробь со знаком), затем преобразованная переменная k1 в строку символов, и, наконец, строка символов должна быть сохранена в переменную строкового типа S. Функция set(handles.edit1,'String',S); выводит в окно текстового вывода (см. выше) строковую переменную S. Как видно из строк S=sprintf('%g',k1); и затем set(handles.edit1,'String',S);, переменная k1 выводится в окно вывода (элемент типа Edit Text) с тэгом edit1. Аналогично легко определить, что переменные выводятся в окна с тэгами edit1, …, edit14, то есть те же самые, которые служат для ввода исходной информации, и в соответствии с пояснениями (названиями вводимых параметров), написанными на панели интерфейса (рис.2.1.3) рядом с окнами ввода исходных значений. function VivodArgumentovNaEkran(hObject, eventdata, handles) global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1; %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); set(handles.edit9,'String',S); S=sprintf('%g',P1); set(handles.edit10,'String',S); S=sprintf('%g',P2); set(handles.edit11,'String',S); S=sprintf('%g',P3); set(handles.edit12,'String',S); S=sprintf('%g',P4); set(handles.edit14,'String',S); S=sprintf('%g',Hp1); set(handles.edit13,'String',S); end Функция ReshitZadachu имеет центральное (наиглавнейшее) значение в ходе решения поставленной задачи (об отыскании результатов исходя из известных начальных данных). Функция ReshitZadachu получает в качестве аргумента функции вектор VectorArg который содержит все основные исходные данные, последовательно расположенные как элементы вектора. Функция ReshitZadachu возвращает (ее возвращаемым значением является) вектор результатов VectorRes, который содержит вычисляемые результаты, которые в дальнейшем другой функцией (функцией вывода VivodResultNaEkran) будут выводиться в качестве результатов в окнах интерфейса (рис.2.1.3) и сохраняться в файл (ниже будет описано).
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); H1=Hp1; Функция findH осуществляет вычисления в соответствии с формулами (9): function f=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1) 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); v5=v1-v3; P6=P5-sgn(v5)*(v5/k5)^2; v2=k2*sqrt(abs(P2-P6))*sgn(P2-P6); v4=k4*sqrt(P6-P4)*sgn(P6-P4); f=v2+v5-v4; end Далее методом деления пополам осуществляется вычисление высоты жидкости в первой емкости: %podgotovka k deleniju popolam (naiti minimum f(H1)) %granici poiska Hleft=0; Hright=Hg1*(P1-Pn)/P1; %shag poiska stepH=(Hright-Hleft)/9; x(1)=Hleft; y(1)=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,x(1)); %poisk intervala smeni znakov for i=2:10 x(i)=x(i-1)+stepH; y(i)=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,x(i)); if y(i)*y(i-1)<0 Hleft=x(i-1); Hright=x(i); break; end end %delenije popolam -- naiti H1 while abs(Hleft-Hright)>0.0001 Hmid=(Hright+Hleft)/2; yleft=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hleft); ymid=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hmid); yright=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hright); if yleft==0 H1=Hleft; break; elseif ymid==0 H1=Hmid; break; elseif yright==0 H1=Hright; break; end if yleft*ymid<0 Hright=Hmid; elseif yright*ymid<0 Hleft=Hmid; end H1=Hmid; end Далее вычисляется высота жидкости во второй емкости: %kvadratnoje uravnenije %H2^2*(Rho*9.81)+H2*(-P6-Rho*9.81*Hg2)+(P6*Hg2-Pn*Hg2)=0 %koefficienti polinoma p(1)=Rho*9.81; p(2)=-P6-Rho*9.81*Hg2; p(3)=P6*Hg2-Pn*Hg2; %korni polinoma korni=roots(p); H2=0;%objavili peremennuju H2 i inicializirovali ee if (korni(1)>0) && (korni(1)<Hg2) H2=korni(1); else H2=korni(2); end Далее вычисляется Р 8: P8=Pn*Hg2/(Hg2-H2); Возвращаемым значением является) вектор результатов VectorRes, который содержит вычисляемые результаты VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2]; end Функция VivodResultNaEkran выводит, предварительно преобразовав в строку текста, переменные – результаты вычислений в окна вывода на панели «Результаты вычислений» (рис.2.1.3) с тэгами edit15, …, edit25, то есть пронумерованными подряд. Вывод происходит в окна в соответствии с подписями рядом с ними (рис.2.1.3) с названиями выводимых расчетных параметров (результатов вычислений). function VivodResultNaEkran(hObject, eventdata, handles) global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; %vivod resultatov na ekran S=sprintf('%g',H1); set(handles.edit24,'String',S); 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',H2); set(handles.edit25,'String',S); end Функция PostrGrafic строит график. Как видно из текста функции, она использует имя (порядковый номер подписанный у соответствующего окна в интерфейсе) NameArg аргумента (отображаемого по горизонтальной оси), использует имя (порядковый номер подписанный у соответствующего окна в интерфейсе) NameVar зависимой переменной (отображаемой по вертикальной оси), шкалу по горизонтальной оси от значения LeftNameVar до значения RightNameVar с шагом StepGr (шаг отображается в разметке горизонтальной оси и в шаге между точками графика). Кроме того, функция PostrGrafic строит график. Затем функция подготавливает подписи к горизонтальной оси и к вертикальной оси и размещает их в соответствующих двух массивах. В каждом из массивов подписи из одинакового количества символов, включая пробелы. Последняя подпись в каждом массиве на один символ длиннее.
Затем функция подготавливает подпись к горизонтальной оси, учитывая, что длина подписи принимается одиннадцать символов (последняя подпись в массиве делается на один знак длиннее). Функция выбирает подпись - элемент массива с номером 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) Функция использует имя (порядковый номер подписанный у соответствующего окна в интерфейсе) NameArg аргумента (отображаемого по горизонтальной оси), использует имя (порядковый номер подписанный у соответствующего окна в интерфейсе) NameVar зависимой переменной (отображаемой по вертикальной оси), шкалу по горизонтальной оси от значения LeftNameVar до значения RightNameVar с шагом StepGr (шаг отображается в разметке горизонтальной оси и в шаге между точками графика). 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; global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D; 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]; VectorArg(NameArg)=LeftNameVar; k1Array(1)=LeftNameVar; [VectorRes]=ReshitZadachu(VectorArg); v1Array(1)=VectorRes(NameVar); for i=2:NumberSteps+1 k1Array(i)=k1Array(i-1)+StepGr; VectorArg(NameArg)=k1Array(i); [VectorRes]=ReshitZadachu(VectorArg); v1Array(i)=VectorRes(NameVar); end Функция строит график. Затем функция подготавливает подписи к горизонтальной оси и к вертикальной оси и размещает их в соответствующих двух массивах. В каждом из массивов подписи из одинакового количества символов, включая пробелы. Последняя подпись в каждом массиве на один символ длиннее. plot(k1Array,v1Array,'o-'); set(gca,'XGrid','on'); set(gca,'YGrid','on');
%podpisi k osyam TextVectorArg=[' k1 ','k2 ','k3 ','k4 ','k5 ','Rho(kg/m3) ','Hg1 (m) ','Hg2 (m) ','Pn (Pa) ','P1 (Pa) ','P2 (Pa) ','P3 (Pa) ','P4 (Pa) ','H1 (m) ']; TextVectorRes=[' v1(l/s) ','v2(l/s) ','v3(l/s) ','v4(l/s) ','v5(l/s) ',' P5(Pa) ',' P6(Pa) ',' P7(Pa) ',' P8(Pa) ','H1 (m) ','H2 (m) ']; Затем функция подготавливает подпись к горизонтальной оси, учитывая, что длина подписи принимается одиннадцать символов (последняя подпись в массиве делается на один знак длиннее). Функция выбирает подпись - элемент массива с номером NameArg. Также функция подготавливает подпись к вертикальной оси, учитывая, что длина подписи принимается восемь символов (последняя подпись в массиве делается на один знак длиннее). Функция выбирает подпись - элемент массива с номером NameVar. xLlabel=' '; for i=((NameArg-1)*11+1):(NameArg*11+1) xLlabel=strcat(xLlabel,TextVectorArg(i)); end yLlabel=' '; for i=((NameVar-1)*8+1):(NameVar*8+1) yLlabel=strcat(yLlabel,TextVectorRes(i)); end Затем функция PostrGrafic подписывает оси подготовленными для этого подписями. xlabel(xLlabel); ylabel(yLlabel); Функция PostrGrafic присваивает значения равные нулю переменным, связанным с построением трехмерного графика. Это обеспечивает согласованную работу с некоторыми другими функциями 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 k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1; global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D; 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]; 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]=ReshitZadachu(VectorArg); Array_3D(j,i)=VectorRes(NameVar); end %for j end %for i %LeftNameVar %StepGr %RightNameVar %LeftNameArg_3D %StepGr_3D %RightNameArg_3D [x,y]=meshgrid(LeftNameVar:StepGr:RightNameVar,LeftNameArg_3D:StepGr_3D:RightNameArg_3D); %x %число столбцов=NumberSteps+1 число строк=NumberSteps_3D+1 %y %число столбцов=NumberSteps+1 число строк=NumberSteps_3D+1 %Array_3D число столбцов=NumberSteps+1 число строк=NumberSteps_3D+1 mesh(x,y,Array_3D); %podpisi k osyam TextVectorArg=[' k1 ','k2 ','k3 ','k4 ','k5 ','Rho(kg/m3) ','Hg1 (m) ','Hg2 (m) ','Pn (Pa) ','P1 (Pa) ','P2 (Pa) ','P3 (Pa) ','P4 (Pa) ','H1 (m) ']; TextVectorRes=[' v1(l/s) ','v2(l/s) ','v3(l/s) ','v4(l/s) ','v5(l/s) ',' P5(Pa) ',' P6(Pa) ',' P7(Pa) ',' P8(Pa) ','H1 (m) ','H2 (m) ']; xLlabel=' '; for i=((NameArg-1)*11+1):(NameArg*11+1) xLlabel=strcat(xLlabel,TextVectorArg(i)); end yLlabel=' '; for i=((NameArg_3D-1)*11+1):(NameArg_3D*11+1) yLlabel=strcat(yLlabel,TextVectorArg(i)); end
zLlabel=' '; for i=((NameVar-1)*8+1):(NameVar*8+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 из окна «номер аргумента» с тэгом edit33, LeftNameArg_3D из окна «минимальный» с тэгом edit34, RightNameArg_3D из окна «максимальный» с тэгом edit36, StepGr_3D из окна «шаг» с тэгом edit35. Необходимо присвоить этим окнам соответствующие тэги. Если NameArg_3D равен нулю, то вызывается функция PostrGrafic для построения плоского графика. По умолчанию в окне панели для построения трехмерного графика «Объемный график» NameArg_3D «номер аргумента» (рис.2.1.3) стоит ноль. Его надо указать при создании интерфейса как значение ‘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 k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1; global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D; 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 описанную выше: VvodIshodnDannih(hObject, eventdata, handles); NumberSteps=round((RightNameVar-LeftNameVar)/StepGr); NameArg_3D=str2double(get(handles.edit33,'String')); Вызывает функцию PostrGrafic описанную выше: if NameArg_3D==0 PostrGrafic(hObject, eventdata, handles); else LeftNameArg_3D=str2double(get(handles.edit34,'String')); RightNameArg_3D=str2double(get(handles.edit36,'String')); StepGr_3D=str2double(get(handles.edit35,'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 v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; Вызывает функцию VvodIshodnDannih описанную выше: VvodIshodnDannih(hObject, eventdata, handles); VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1]; Вызывает функцию ReshitZadachu описанную выше: [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); Вызывает функцию VivodResultNaEkran описанную выше: 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 v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; Вызывает функцию, соответствующую нажатию кнопки с надписью ВЫЧИСЛИТЬ, и получает результаты вычислений: %Vichislit resultati pushbutton3_Callback(hObject, eventdata, handles); Создает и открывает для записи файл C:\ MATLAB 701\ work \ S 279 Res. txt, предполагая, что рабочая директория MATLAB – это C:\ MATLAB 701\ work (в противном случае перед применением программу надо модифицировать, поместив на это место соответствующую папку и путь к ней): %otkrit fail dlya zapisi [f,p]=uiputfile('C:\MATLAB701\work\S279Res.txt','Окно выбора'); KudaZapisat=strcat(p,f); f=fopen(KudaZapisat,'wt'); %gotovim dannije dlja avtomaticheskogo schitivanija VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1]; 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:14 fprintf(f,'%g\t',VectorArg(i)); end %sohranit v fail resultati vichislenij fprintf(f,'\nS279_STAT_REG_IN_HIDRAVL_SIST_08\n'); fprintf(f,'RESULTATI VICHISLENIY\n'); TextString=strcat(' v1(l/s) ','v2(l/s) ','v3(l/s) ','v4(l/s) ','v5(l/s) ',' P5(Pa) ',' P6(Pa) ',' P7(Pa) ',' P8(Pa) ','H1 (m) ','H2 (m) '); fprintf(f,TextString); fprintf(f,'\n'); for i=1:11 fprintf(f,'%g\t',VectorRes(i)); end %sohranit v fail ishodnije argumenti fprintf(f,'\nARGUMENTI VICHISLENIY\n'); TextString=strcat(' k1 ','k2 ','k3 ','k4 ','k5 ','Rho(kg/m3) ','Hg1 (m) ','Hg2 (m) ','Pn (Pa) ','P1 (Pa) ','P2 (Pa) ','P3 (Pa) ','P4 (Pa) ','H1 (m) '); fprintf(f,TextString); fprintf(f,'\n'); for i=1:14 fprintf(f,'%g\t',VectorArg(i)); end fclose(f); end Функция pushbutton14_Callback вызывается кнопкой «ОТКРЫТЬ ИЗ ФАЙЛА», необходимо этой кнопке присвоить тэг pushbutton14, функция обеспечивает открытие из файла исходных данных и результатов и вывод их в окна интерфейса. График она не строит. function pushbutton14_Callback(hObject, eventdata, handles) clear global; global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1; %Otkrit is faila [f,p]=uigetfile('C:\MATLAB701\work\S279Res*.txt','Окно выбора'); OtkudaChitat=strcat(p,f); f=fopen(OtkudaChitat,'rt'); %chitat is faila for i=1:11 VectorRes(i)=fscanf(f,'%g',1); end for i=1:14 VectorArg(i)=fscanf(f,'%g',1); if (i>8)&&(i<14) VectorArg(i)=(VectorArg(i))/1000; end 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); %vivod na ekran VivodResultNaEkran(hObject, eventdata, handles); VivodArgumentovNaEkran(hObject, eventdata, handles); 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; global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; 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\S279Graf.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]; for i=1:14 fprintf(f,'%g\t',VectorArg(i)); end 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; %otkrit grafic is faila [f,p]=uigetfile('C:\MATLAB701\work\S279Graf*.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:14 VectorArg(i)=fscanf(f,'%g',1); if (i>8)&&(i<14) VectorArg(i)=(VectorArg(i))/1000; end 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); %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; 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 end ВЫЧИСЛИТЬ Функция GLAV_Vichislit_pushbutton3_Callback не связана ни с какими элементами (кнопками) графического интерфейса, так как графического интерфейса нет, но выполняет те же самые задачи, что и раньше 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 v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; DATA; Pn=1000*Pn; P1=1000*P1; P2=1000*P2; P3=1000*P3; P4=1000*P4; VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1]; [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 Необходимо описать функцию 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); H1=Hp1; %vichislenije vseh vihodnih peremennih krome H1, H2, P8 function [znak]=sgn(a) if a<0 znak=-1; elseif a>0 znak=1; else znak=0; end end function f=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1) 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); v5=v1-v3; P6=P5-sgn(v5)*(v5/k5)^2; v2=k2*sqrt(abs(P2-P6))*sgn(P2-P6); v4=k4*sqrt(P6-P4)*sgn(P6-P4); f=v2+v5-v4; end %podgotovka k deleniju popolam (naiti minimum f(H1)) %granici poiska Hleft=0; Hright=Hg1*(P1-Pn)/P1; %shag poiska stepH=(Hright-Hleft)/9; x(1)=Hleft; y(1)=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,x(1)); %poisk intervala smeni znakov for i=2:10 x(i)=x(i-1)+stepH; y(i)=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,x(i)); if y(i)*y(i-1)<0 Hleft=x(i-1); Hright=x(i); break; end end %delenije popolam -- naiti H1 while abs(Hleft-Hright)>0.0001 Hmid=(Hright+Hleft)/2; yleft=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hleft); ymid=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hmid); yright=findH(k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hright); if yleft==0 H1=Hleft; break; elseif ymid==0 H1=Hmid; break; elseif yright==0 H1=Hright; break; end if yleft*ymid<0 Hright=Hmid; elseif yright*ymid<0 Hleft=Hmid; end H1=Hmid; end %kvadratnoje uravnenije %H2^2*(Rho*9.81)+H2*(-P6-Rho*9.81*Hg2)+(P6*Hg2-Pn*Hg2)=0 %koefficienti polinoma p(1)=Rho*9.81; p(2)=-P6-Rho*9.81*Hg2; p(3)=P6*Hg2-Pn*Hg2; %korni polinoma korni=roots(p); H2=0;%objavili peremennuju H2 i inicializirovali ee if (korni(1)>0)&&(korni(1)<Hg2) H2=korni(1); else H2=korni(2); end %naiti P8 P8=Pn*Hg2/(Hg2-H2); VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2]; 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; %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') ' м']); end Для более подробного изучения, следует подготовить нижеследующие функции. Они позволят построить графики – плоские и трехмерные, а также сохранить результаты вычислений и графики в файл и открыть их из файла. Все они не связаны с графическим интерфейсом и для получения исходных данных обращаются к функции DATA, а для вывода значений аргументов и вычисленных результатов – к вышеописанным функциям VivodArgumentovNaEkran и VivodResultNaEkran, выводящим в Command Window. Функция PostrGrafic_3D строит трехмерный график. function PostrGrafic_3D 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; global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D; 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]; 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]=ReshitZadachu(VectorArg); %VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2]; Array_3D(j,i)=VectorRes(NameVar); end %for j end %for i [x,y]=meshgrid(LeftNameVar:StepGr:RightNameVar,LeftNameArg_3D:StepGr_3D:RightNameArg_3D); %x %число столбцов=NumberSteps+1 число строк=NumberSteps_3D+1 %y %число столбцов=NumberSteps+1 число строк=NumberSteps_3D+1 %Array_3D %число столбцов=NumberSteps+1 число строк=NumberSteps_3D+1 mesh(x,y,Array_3D); %podpisi k osyam TextVectorArg=[' k1 ','k2 ','k3 ','k4 ','k5 ','Rho(kg/m3) ','Hg1 (m) ','Hg2 (m) ','Pn (Pa) ','P1 (Pa) ','P2 (Pa) ','P3 (Pa) ','P4 (Pa) ','H1 (m) ']; TextVectorRes=[' v1(l/s) ','v2(l/s) ','v3(l/s) ','v4(l/s) ','v5(l/s) ',' P5(Pa) ',' P6(Pa) ',' P7(Pa) ',' P8(Pa) ','H1 (m) ','H2 (m) ']; xLlabel=' '; for i=((NameArg-1)*11+1):(NameArg*11+1) xLlabel=strcat(xLlabel,TextVectorArg(i)); end yLlabel=' '; for i=((NameArg_3D-1)*11+1):(NameArg_3D*11+1) yLlabel=strcat(yLlabel,TextVectorArg(i)); end zLlabel=' '; for i=((NameVar-1)*8+1):(NameVar*8+1) zLlabel=strcat(zLlabel,TextVectorRes(i)); end xlabel(xLlabel); ylabel(yLlabel); zlabel(zLlabel); v1Array=0; end Функция PostrGrafic строит обычный график. function PostrGrafic 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; global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D; 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]; VectorArg(NameArg)=LeftNameVar; k1Array(1)=LeftNameVar; [VectorRes]=ReshitZadachu(VectorArg); v1Array(1)=VectorRes(NameVar); for i=2:NumberSteps+1 k1Array(i)=k1Array(i-1)+StepGr; VectorArg(NameArg)=k1Array(i); [VectorRes]=ReshitZadachu(VectorArg); v1Array(i)=VectorRes(NameVar); end plot(k1Array,v1Array,'o-'); set(gca,'XGrid','on'); set(gca,'YGrid','on'); %podpisi k osyam TextVectorArg=[' k1 ','k2 ','k3 ','k4 ','k5 ','Rho(kg/m3) ','Hg1 (m) ','Hg2 (m) ','Pn (Pa) ','P1 (Pa) ','P2 (Pa) ','P3 (Pa) ','P4 (Pa) ','H1 (m) ']; TextVectorRes=[' v1(l/s) ','v2(l/s) ','v3(l/s) ','v4(l/s) ','v5(l/s) ',' P5(Pa) ',' P6(Pa) ',' P7(Pa) ',' P8(Pa) ','H1 (m) ','H2 (m) ']; xLlabel=' '; for i=((NameArg-1)*11+1):(NameArg*11+1) xLlabel=strcat(xLlabel,TextVectorArg(i)); end yLlabel=' '; for i=((NameVar-1)*8+1):(NameVar*8+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 Функция GLAV_Vichislit_Sohranit запускается и обеспечивает вычисление результатов и их сохранение в файл. function GLAV_Vichislit_Sohranit_pushbutton2_Callback global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1 v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; %Vichislit resultati GLAV_Vichislit_pushbutton3_Callback; VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1]; VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2]; %otkrit fail dlya zapisi [f,p]=uiputfile('C:\MATLAB701\work\S279Res.txt','Окно выбора'); KudaZapisat=strcat(p,f); f=fopen(KudaZapisat,'wt'); %gotovim dannije dlja avtomaticheskogo schitivanija for i=1:11 fprintf(f,'%g\t',VectorRes(i)); end for i=1:14 fprintf(f,'%g\t',VectorArg(i)); end %sohranit v fail resultati vichislenij fprintf(f,'\nS279_STAT_REG_IN_HIDRAVL_SIST_08\n'); fprintf(f,'RESULTATI VICHISLENIY\n'); TextString=strcat(' v1(l/s) ','v2(l/s) ','v3(l/s) ','v4(l/s) ','v5(l/s) ',' P5(Pa) ',' P6(Pa) ',' P7(Pa) ',' P8(Pa) ','H1 (m) ','H2 (m) '); fprintf(f,TextString); fprintf(f,'\n'); for i=1:11 fprintf(f,'%g\t',VectorRes(i)); end %sohranit v fail ishodnije argumenti fprintf(f,'\nARGUMENTI VICHISLENIY\n'); TextString=strcat(' k1 ','k2 ','k3 ','k4 ','k5 ','Rho(kg/m3) ','Hg1 (m) ','Hg2 (m) ','Pn (Pa) ','P1 (Pa) ','P2 (Pa) ','P3 (Pa) ','P4 (Pa) ','H1 (m) '); fprintf(f,TextString); fprintf(f,'\n'); for i=1:14 fprintf(f,'%g\t',VectorArg(i)); end fclose(f); end Функция GLAV_PostrGrafic_Sohranit запускается и обеспечивает построение графика и его сохранение в файл. function GLAV_PostrGrafic_Sohranit_pushbutton8_Callback 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; global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D; global PG; %postroit grafic PG=1; GLAV_PostrGrafic_pushbutton13_Callback; PG=0; %Sohranit grafic v fail [f,p]=uiputfile('C:\MATLAB701\work\S279Graf.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 VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,Hp1]; for i=1:14 fprintf(f,'%g\t',VectorArg(i)); end fclose(f); end Функция GLAV_PostrGrafic запускается и обеспечивает построение графика (смотри рис.2.1.5 ниже). function GLAV_PostrGrafic_pushbutton13_Callback 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 k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1; global v1 v2 v3 v4 v5 P5 P6 P7 P8 H1 H2; global k1Array v1Array Array_3D xLlabel yLlabel zLlabel NumberSteps NumberSteps_3D; DATA_Graf; DATA; Pn=1000*Pn; P1=1000*P1; P2=1000*P2; P3=1000*P3; P4=1000*P4; NumberSteps=round((RightNameVar-LeftNameVar)/StepGr); if NameArg_3D==0 PostrGrafic; else NumberSteps_3D=round((RightNameArg_3D-LeftNameArg_3D)/StepGr_3D); PostrGrafic_3D; end %if end Рис.2.1.5. Графики. Функция GLAV_Otkrit_Grafic запускается и обеспечивает открытие графика из файла. function GLAV_Otkrit_Grafic_pushbutton15_Callback clear global; global k1 k2 k3 k4 k5 Rho Hg1 Hg2 Pn P1 P2 P3 P4 Hp1; %otkrit grafic is faila [f,p]=uigetfile('C:\MATLAB701\work\S279Graf*.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
|
|||||||||||
Последнее изменение этой страницы: 2020-10-24; просмотров: 61; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.104.248 (0.762 с.) |