Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Обозначения переменных в тексте программы
Исходные данные. k1, k2, k3, k4, k5 – коэффициенты пропускной способности клапанов (см. рис. 2.1); Rho – плотность жидкости ρ; Hg1 – ; Hg2 – ; Pn – исходное давление газа в пустой емкости PN (в обеих одинаковое, обычно атмосферное); P1, P2, P3, P4 – давления жидкости на входе в систему и, соответственно, на выходе из нее; H1 – (предполагаемый начальный уровень жидкости в емкости). Вычисляемые переменные. v1, v2, v3, v4, v5 – расходы жидкости через клапаны в соответствии с рис. 2.1; P5, P6, P7, P8 – давления жидкости в емкостях; H1, H2 – уровни жидкости после заполнения емкостей. Для построения графика необходимо выбрать исходную величину-аргумент (будет отображаться по горизонтальной оси), диапазон и шаг ее изменения, а также величину-функцию, зависящую от аргумента (вертикальная ось). Построенный график покажет, как будет изменяться зависимая величина при изменении аргумента (при этом значения всех остальных исходных величин, которые были введены в окна ввода исходных величин будут оставаться неизменными) – рис. 2.4. Рис. 2.3. Ввод исходных данных и получение расчетных результатов
Приступая к работе по выполнению задачи на компьютере, нужно выполнить следующую последовательность обращений к кнопкам панели инструментов File→New→M-file, что позволяет открыть окно Editor (то есть редактор М-файлов). В этом окне следует напечатать весь текст необходимой программы (создавать не только лишь отдельные М-файлы для отдельных функций), которая будет выполняться при указании соответствующего этой полной программе имени М-файла в командной строке в Command Window. Иначе программу можно запустить командой Debug→Run в меню редактора М-файлов. При сохранении М-файла (File→Save) в открывающемся окне нужно указать место и имя этого документа. Имя сохраняемого файла должно совпадать с именем описанной в нем функции (то есть описанная в нем программа считается функцией, и ее описание начинается с указания какого-нибудь имени этой функции, под которым она дальше и будет вызваться для исполнения). Если какие-то М-файлы уже созданы ранее, то их можно посмотреть или отредактировать с помощью команды File→Open. Текст программы с комментариями [1]
Функция sgn возвращает знак числа, преобразованный в логическую переменную znak: function [znak]=sgn(a) if a<0 znak=-1; elseif a>0 znak=1; else znak=0; end end Функция VvodIshodnDannih считывает значения исходных переменных, введенные пользователем в окна текстового ввода, и присваивает эти значения соответствующим переменным: function[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2, P3,P4,H1]=VvodIshodnDannih(hObject, eventdata, handles) k1=str2double(get(handles.edit1,'String')); % Функция str2double осуществляет преобразование строки символов в число, например, строка 123 будет преобразована из последовательности отдельных символов 1, 2 и 3 в число 123 и сохранена в возвращаемую функцией переменную числового типа double, то есть вещественное число (десятичная дробь). % Функция get(handles.edit1,'String') возвращает строку символов, которая сохранена в строковой переменной под именем String. % handles.edit1 используется для того, чтобы обратиться к окну визуального интерфейса. Он содержит окно для ввода/вывода текста типа Text Edit, причем таких окон может быть много. Чтобы обратиться к какому-то определенному, используется его индивидуальное название edit1. Таким образом, выражение ааа=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')); H1=str2double(get(handles.edit13,'String')); end Функция VivodArgumentovNaEkran выводит, предварительно преобразовав, переменные (исходные, т. е. введенные пользователем) на экран в соответствующие им окна текстового ввода/вывода. Она нужна при чтении данных из файла, чтобы обратить внимание пользователя на то, каковы были исходные значения в задаче, сохраненной в файл. function[]=VivodArgumentovNaEkran(VectorArg,hObject, eventdata, handles) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) 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); H1=VectorArg(14); %vivod argumentov na ekran[2] S=sprintf('%g',k1); set(handles.edit1,'String',S); %Выражение S=sprintf('%g',k1); означает, что переменная k1 будет преобразована в соответствии с определенным форматом (например, формат %g означает, что нужно преобразовать число в десятичную дробь со знаком), затем преобразованная переменная k1 в строку символов, и, наконец, строка символов должна быть сохранена в переменную строкового типа S. %Функция set(handles.edit1,'String',S); выводит в окно текстового вывода (см. выше) строковую переменную 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',H1); set(handles.edit13,'String',S); end Функция ReshitZadachu решает задачу по нахождению значений переменных, которые потом будут выведены на экран отдельно вызываемой функцией вывода VivodResultNaEkran: 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); H1=VectorArg(14); Функция 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=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2]; end Функция VivodResultNaEkran выводит, предварительно преобразовав в строку текста, переменные – результаты вычислений на экран в окна вывода: function[]=VivodResultNaEkran(VectorRes,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); %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 строит график, который выводится на экран: function[k1Array,v1Array,xLlabel,yLlabel,NumberSteps]=PostrGrafic(VectorRes, VectorArg,LeftNameVar,NumberSteps,StepGr,hObject, eventdata, handles,NameVar,NameArg)
% Array означает массив if (NameArg>8)&(NameArg<14) LeftNameVar=LeftNameVar*1000; StepGr=StepGr*1000; end 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-'); % в апострофах указан тип линии на графике: 'o-' синяя линия с маркерами-кружочками; 'k-' черная линия без маркеров, set(gca,'XGrid','on'); %покрывает сеткой область построения графикой set(gca,'YGrid','on'); 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); end Эта функция pushbutton13_Callback выполняется после нажатия на кнопку интерфейса с надписью ПОСТРОИТЬ ГРАФИК: % --- Executes on button press in pushbutton13.[3] function [k1Array,v1Array,xLlabel,yLlabel,NumberSteps] =pushbutton13_Callback(hObject, eventdata, handles) % hObject handle to pushbutton13 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) 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 описанную выше: [k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1]=VvodIshodnDannih(hObject, eventdata, handles); NumberSteps=round((RightNameVar-LeftNameVar)/StepGr); %objavlyajem peremennije v1=0; v2=0; v3=0; v4=0; v5=0; P5=0; P6=0; P7=0; P8=0; H1=0; H2=0; VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2]; VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1]; Вызывает функцию PostrGrafic описанную выше: [k1Array,v1Array,xLlabel,yLlabel,NumberSteps]=PostrGrafic(VectorRes, VectorArg,LeftNameVar,NumberSteps,StepGr,hObject, eventdata, handles,NameVar,NameArg); end Выполняется после нажатия на кнопку интерфейса с надписью ВЫЧИСЛИТЬ: % --- Executes on button press in pushbutton3. function [VectorRes,VectorArg]=pushbutton3_Callback(hObject, eventdata, handles) % hObject handle to pushbutton3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) Вызывает функцию VvodIshodnDannih описанную выше: [k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1]=VvodIshodnDannih(hObject, eventdata, handles); VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1]; v1=0; v2=0; v3=0; v4=0; v5=0; P5=0; P6=0; P7=0; P8=0; H1=0; H2=0; VectorRes=[v1,v2,v3,v4,v5,P5,P6,P7,P8,H1,H2]; Вызывает функцию ReshitZadachu описанную выше: [VectorRes]=ReshitZadachu(VectorArg); Вызывает функцию VivodResultNaEkran описанную выше: VivodResultNaEkran(VectorRes,hObject, eventdata, handles); end Выполняется после нажатия на кнопку интерфейса с надписью СОХРАНИТЬ В ФАЙЛ и сохраняет результаты в файл: % --- Executes on button press in pushbutton2. function pushbutton2_Callback(hObject, eventdata, handles);
Вызывает функцию, соответствующую нажатию кнопки с надписью ВЫЧИСЛИТЬ, и получает результаты вычислений: %Vichislit resultati [VectorRes,VectorArg]=pushbutton3_Callback(hObject, eventdata, handles); Создает и открывает для записи файл C:\MATLAB701\work\S279Res.txt, предполагая, что рабочая директория MATLAB – это C:\MATLAB701\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 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 Выполняется после нажатия на кнопку интерфейса с надписью ОТКРЫТЬ ИЗ ФАЙЛА и открывает данные из файла: % --- Executes on button press in pushbutton14. function pushbutton14_Callback(hObject, eventdata, handles) %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); %vivod na ekran VivodResultNaEkran(VectorRes,hObject, eventdata, handles); VivodArgumentovNaEkran(VectorArg,hObject, eventdata, handles); end Выполняется после нажатия на кнопку интерфейса с надписью СОХРАНИТЬ ГРАФИК В ФАЙЛ: % --- Executes on button press in pushbutton8. function pushbutton8_Callback(hObject, eventdata, handles) %postroit grafic [k1Array,v1Array,xLlabel,yLlabel,NumberSteps]=pushbutton13_Callback(hObject, eventdata, handles); %Sohranit grafic v fail [f,p]=uiputfile('C:\MATLAB701\work\S279Graf.txt','Окно выбора'); KudaZapisat=strcat(p,f); f=fopen(KudaZapisat,'wt'); %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 %zapisivajem argumenti [k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1]=VvodIshodnDannih (hObject, eventdata, handles); VectorArg=[k1,k2,k3,k4,k5,Rho,Hg1,Hg2,Pn,P1,P2,P3,P4,H1]; for i=1:14 fprintf(f,'%g\t',VectorArg(i)); end %podpisi k osyam grafica fprintf(f,'%s\t%s\n',xLlabel,yLlabel); fclose(f); end Выполняется после нажатия на кнопку интерфейса с надписью ОТКРЫТЬ ГРАФИК ИЗ ФАЙЛА: % --- Executes on button press in pushbutton15. function pushbutton15_Callback(hObject, eventdata, handles) %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); for i=1:NumberSteps+1 k1Array(i)=fscanf(f,'%g',1); end for i=1:NumberSteps+1 v1Array(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 xLlabel=fscanf(f,'%s',1); yLlabel=fscanf(f,'%s',1); fclose(f); %stroim grafic plot(k1Array,v1Array,'o-'); set(gca,'XGrid','on'); set(gca,'YGrid','on'); xlabel(xLlabel); ylabel(yLlabel); %vivod na ekran VivodArgumentovNaEkran(VectorArg,hObject, eventdata, handles); End
|
||||||||
Последнее изменение этой страницы: 2017-02-19; просмотров: 275; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.21.34.0 (0.154 с.) |