Аналитическое решение задач линейной алгебры. 
";


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



ЗНАЕТЕ ЛИ ВЫ?

Аналитическое решение задач линейной алгебры.



Функция length определяет длину вектора.

Функция prod вычисляет произведение элементов вектора.

Функция sum определяет сумму элементов вектора.

Функция mean определяет среднее арифметическое вектора.

Функция dot вычисляет скалярное произведение векторов.

Функция cross вычисляет векторное произведение векторов.

Функция sort выполняет сортировку по возрастанию, а – sort по убыванию элементов вектора.

Функция diag формирует матрицу с заданными элементами на заданной диагонали или возвращает элементы заданной диагонали.

Функция cat объединяет матрицы.

Функция tril формирует нижнетреугольную матрицу.

Функция triu формирует верхнетреугольную матрицу.

Функция size определяет размеры матрицы.

Функция det находит определитель матрицы.

Функция trace находит след (сумму по диагонали) матрицы.

Функция inv находит обратную матрицу.

Функция eig находит вектор собственных значений матрицы.

Функция poly находит вектор коэффициентов характеристического полинома матрицы. Все эти функции уже рассматривались раньше. Формат их вызова тот же.

function Start_sym4 syms a b c d a1=length([a b c d]) a2=prod([a b c d]) a3= sum([a b c d]) a4=mean([a b c d]) end a1 = 4 a2 = a*b*c*d a3 = a+b+c+d a4 = 1/4*a+1/4*b+1/4*c+1/4*d

Построение графика символьной функции. Построить график (рис.1.55) функции одной переменной можно функцией ezplot. Для этого указывают символьное выражение и границы изменения переменной (по умолчанию от 0 до 2π).

Рис.1.55. Построение графика ezplot('sin(x)',[0, 6.28])

Также она позволяет (рис.1.56) отображать параметрические функции. Для этого указывают аргументы функции: имена символьных выражений (двух) и границы изменения параметра. Если границы не указаны, то по умолчанию от 0 до 2π.

Рис.1.56. График ezplot('x^2/3+y^2/5-1',[-2 2 -4 4]).

Для построения символьной функции в полярных координатах (рис.1.57, рис.1.58) предусмотрена функция

ezpolar (функция f (Rho), [интервал изменения Rho ]).

По умолчанию интервал от 0 до 2π.

Рис.1.57. График символьной функции в полярных координатах ezpolar (' sin (6* fi)')

x=('cos(t)+t*sin(t)'); y=('sin(t)-t*cos(t)'); ezplot(x,y,[0 4*pi])  

Рис.1.58. График символьной функции в полярных координатах

Объемные графики строит функция ezsurf (функция, Х min, Xmax, Ymin, Ymax) где по умолчанию переменные ограничены от 0 до 2π.

Если нужно показать еще и линии уровня, то можно использовать функцию ezsurfc. Если надо нанести контурные линии, то можно (рис.1.59) использовать ezmesh.

Рис.1.59. Объемный график символьной функции ezmesh('1-x^2-y^2',[-5 5 -5 5])

А если надо строить поверхность с нанесением контуров и линиями уровня, то можно использовать ezmeshc.

Для построения поверхности, заданной функциями в параметрическом виде (рис.1.60), используется ezplot 3(X, Y, Z, [ Tmin, Tmax ]), где указаны аргументы (зависящие от параметра) и границы изменения параметра. По умолчанию параметр изменяется от 0 до 2π. Аргументы можно указывать как символьные выражения.

Рис.1.60. График поверхности, ezplot3('t*sin(t)','t*cos(t)','t^2',[0 10*pi])

Решение уравнений и систем в символьном виде. Функция solve (уравнение1, уравнение2, и т.д., переменнаяХ1, переменнаяХ2, и т.д.) возвращает значения переменных, перечисленных в ее аргументах, при которых соблюдаются равенства, заданные уравнениями, перечисленными в ее аргументах. Если же вычислить значение переменной не удалось, то она будет выражена через остальные переменные.

>> syms x >> solve(x^5-x^3+1, x)  ans = .95904771789275592744010129430222+.4283659562541893163489787094*i .34079486619700641527131389381414+.7854231030494490805285528960*i  -1.2365057033914990243375748009761  -.34079486619700641527131389381414-.785423103049449080528552896*i .95904771789275592744010129430222-.428365956254189316348978709*i

Или, например, с несколькими переменными, или тригонометрическая функция.

>> syms a b c >> y=solve(a*x^2+b*x+c, x)  y = 1/2/a*(-b+(b^2-4*a*c)^(1/2))  1/2/a*(-b-(b^2-4*a*c)^(1/2)) >> f=sym('sin(x)^2-x/2'); >> y=solve(f,x)  y =  0

Для примера найдем уравнение окружности, проходящей через точки М(26, 4), О(9, 21), К(17, 17). Для этого составим систему из трех уравнений окружности, в каждое из которых подставлены координаты одной из точек. Решим его функцией solve и затем сформируем уравнение окружности (ответ нашей задачи) с помощью функции simplify, которая подставит найденные корни уравнения на соответствующие места в формуле. Функцию solve удобно применять для решения систем уравнений. После нахождения корней уравнений, удобно применить функцию simplify. Она подставит на место соответствующих переменных их вычисленные значения.

function Start_sym5 syms x0 y0 R f1=sym('(26-x0)^2+(4-y0)^2-R^2'); f2=sym('(9-x0)^2+(21-y0)^2-R^2'); f3=sym('(17-x0)^2+(17-y0)^2-R^2'); [R,x0,y0]=solve(f1,f2,f3,x0,y0,R) syms xx yy RR F=simplify(subs('(x-xx)^2+(y-yy)^2-RR^2',{xx yy RR},{x0(1) y0(1) R(1)})) end   R = 25  -25  x0 = 2  2  y0 = -3  -3 F = x^2-4*x-612+y^2+6*y

Вычисление пределов. Для вычисления пределов при числе членов последовательности, стремящемся к бесконечности, есть функция limit (функция, имяПеременной, пределПоследовательности). Так, например, выражение limit (f 1,’ n ’, inf) это поиск предела последовательности при n стремящемся к бесконечности.

function Start_sym6 f1=sym('((n+1)^3-(n-1)^3)/((n+1)^2+(n-1)^2)'); a1=limit(f1,'n',inf) end a1=  3

Отдельно рассматривается ее применение для нахождения пределов функций. Так, например, выражение limit (f,’ x ’,3) означает что найден предел функции при Х стремящемся к 3. А вот выражение limit (1+1/ x, x, inf) означает что найден предел функции при Х стремящемся к бесконечности.

Совершенно так же решаются и все неопределенности. Если же надо найти односторонний предел, то пишут с какой стороны его искать (справа или слева).

function Start_sym7 f=sym('2^(1/(x^2-4))'); a1= limit(f,x,2,'right') a2= limit(f,x,2,'left') f=sym('3*x+1'); a3= limit(f,'x',3) syms x a4= limit(1+1/x,x,inf) end a1 =  Inf a2 =  0 a3 =  10 a4 =  1  

Вычисление производной. Символьное дифференцирование выполняет команда diff (функция, имяПеременной, порядокПроизводной).

Если нет имени, то по умолчанию будет выбрана первая по алфавиту переменная. По умолчанию вычисляется первая производная.

Подставить значение переменной в найденную формулу производной можно с помощью subs (функция, имяПеременной, ееЗначение).

function Start_Sym8 g=diff('5*(sin(x)^2)',x,1) a1= subs(g,x,pi/4) end a1 = 5 g =  10*sin(x)*cos(x)

Вычисление интеграла. Для неопределенного интеграла есть функция int (функция, переменная). Для определенного интеграла еще приписывают пределы интегрирования в список аргументов.

Для несобственного интеграла один из пределов равен бесконечности.

function Start_Sym9 a1=int('cos(x)',x) f=sym('(sin(x)^2)/(cos(x)+5)'); a2=int(f,x,0,pi) a3= int('1/(x^2)',x,1,inf) end a1 =  sin(x) a2 =  5*pi-2*6^(1/2)*pi a3 =  1

Числовые ряды. Ряд Тейлора. Для вычисления суммы ряда есть функция symsum (общийЧленРяда, переменная, пределыЕеИзменения).

function Start_Sym10  f=sym('1/(n^2)'); a1= symsum(f,'n',1,inf)  end a1 =  1/6*pi^2

Для разложения в ряд Тейлора (ряд Маклорена его частный случай) есть функция taylor (функция, номер), где номер означает, до какого члена ряда выполняется разложение. По умолчанию до шестого члена ряда.

Если же надо разложить в ряд Тейлора в окрестности точки А, то ее надо указать в списке аргументов taylor (функция, точкаА, номер).

function Start_Sym11 g=taylor(exp(x),'a',3) a1=subs(g,a,4) end g =  exp(a)+exp(a)*(x-a)+1/2*exp(a)*(x-a)^2 a1 =  exp(4)+exp(4)*(x-4)+1/2*exp(4)*(x-4)^2

Дифференциальные уравнения. Их и их системы решает функция dsolve (список уравнений, список граничных (начальных) условий, независимая переменная).

По умолчанию имя переменной считается t. Имя переменной нельзя начинать с D или d так как это означает производную.

function Start_Sym12 a1=dsolve('Dy-y/(1-x^2)=1+x','y(0)=1','x') a2= dsolve('D2y=x*Dy+y+1') [x,y]=dsolve('D2y=x','D2x=y') a3=dsolve('Dy=(y+1)/x') end   a1 =  (1/2*x*(1-x^2)^(1/2)+1/2*asin(x)+1) *(1+x)/(1-x^2)^(1/2) a2 = exp((1/2*x+1/2*(x^2+4)^(1/2))*t)*C2+exp((1/2*x-1/2*(x^2+4)^(1/2))*t)*C1-1 x =  C1*exp(-t)+C2*exp(t)-C3*sin(t)-C4*cos(t)  y =  C1*exp(-t)+C2*exp(t)+C3*sin(t)+C4*cos(t) a3 =  -1+exp(1/x*t)*C1

Графический интерфейс

Графические объекты. Графические приложения содержат меню, кнопки, области ввода текста, переключатели, графики.

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

Для получения указателей есть функции: gcf возвращает указатель в графическое окно, gca возвращает указатель на оси координат, gco возвращает указатель на графический объект.

Свойства графических объектов. Для установки свойств объектов есть функция set(указатель_на_объект, ‘изменяемое_свойство’, ‘его_новое_значение’, ‘изменяемое_свойство_2’, ‘его_новое_значение_2’).

Для получения свойств объекта есть функция get(указатель_на_объект, ‘свойство’).

Создание программ с визуальным интерфейсом. В окне Command Window  следует набрать guide и тогда откроется окно для создания визуального интерфейса (Рис.1.61). В нем можно выбрать как уже существующие (Open Existing GUI) так и создание нового интерфейса. Для этого предлагаются несколько наиболее распространенных типовых заготовок, а также возможность создать вообще сначала весь интерфейс (Blank GUI Default).

Рис.1.61. В окне Command Window следует набрать guide и тогда откроется окно для создания визуального интерфейса

Для примера создадим вариант интерфейса (Рис.1.62).

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

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

Рис.1.6 2. Вариант интерфейса

Для редактирования свойств элементов интерфейса, определенный элемент дважды щелкнуть мышкой (левой кнопкой). Откроется редактор свойств (Property Inspector). В нем (Рис.1.63) например имя элемента (под которым он фигурирует в компьютере) называется Tag. Найдя слово Tag в левой колонке, в правой увидим само имя (например text1). Надпись на элементе, которая видна в окне интерфейса, называется String. Найдя в левой колонке слово String, в правой ему соответствует сама надпись (например argument x).

Файл интерфейса имеет расширение.fig.

Рис.1.6 3. Редактор свойств

Подготовка М-файла, соответствующего созданному интерфейсу. Для того, чтобы интерфейс (рис.1.64) был связан с выполнением требуемых действий (например, при нажатии на кнопку Calculate происходило бы вычисление функций и вывод их значений в соответствующих окошках) необходимо предварительно описать в М-файле все, что требуется сделать.

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

Поскольку целесообразно начать с описания действий, выполняемых после нажатия на кнопку Calculate, то рассмотрим абзац текста в М-файле, описывающий их.

% --- Executes on button press in pushbutton1. CALCULATE

function pushbutton1_Callback(hObject, eventdata, handles)

 [VectorArg]=VvodArg(hObject, eventdata, handles);

[VectorRes]=ReshitZadachu(VectorArg);

VivodRes(VectorRes,hObject, eventdata, handles);

Для этого в файле интерфейса щелкнем кнопку Calculate, открыв Property Inspector, и найдем Tag этой кнопки. Пусть, например, он оказался pushbutton1. Тогда в М-файле найдем абзац, озаглавленный

function pushbutton1_Callback(hObject, eventdata, handles)

В этом абзаце (то есть ниже строки его заголовка) укажем что должно произойти после ее нажатия.

function[VectorArg]=VvodArg(hObject, eventdata, handles)

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

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

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

VectorArg=[x, y, z];

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

Затем должна быть вызвана функция, решающая задачу вычисления значений-результатов. Она получает вектор значений аргументов и возвращает вектор значений результатов.

function[VectorRes]=ReshitZadachu(VectorArg)

x=VectorArg(1);

y=VectorArg(2);

z=VectorArg(3);

f1=x^2+y+z;

f2=x+y^2+z;

f3=x+y+z^2;

VectorRes=[f1, f2, f3];

После этого должна быть вызвана функция для вывода в соответствующие окошки интерфейса значений из вектора результатов.

function[]=VivodRes(VectorRes,hObject, eventdata, handles)

f1=VectorRes(1);

f2=VectorRes(2);

f3=VectorRes(3);

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

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

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

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

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

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

Упомянутые функции должны быть описаны. Рекомендуется описывать функции выше того места программы, где они вызываются.

Команда x=str2double(get(handles.edit1,'String')); означает что в переменную x будет записано число, возвращаемое функцией str 2 double которая преобразует строку цифр в число.

 Аргумент этой функции это возвращаемое значение функции get(handles.edit1,'String')); которая обращается к элементу интерфейса handles. edit 1 где handles означает обращение к визуальному интерфейсу, edit 1 это обозначение конкретного элемента интерфейса.

Команда S=sprintf('%g',f1); означает что в переменную S будет записана строка символов оператором sprintf('%g',f1); который обращается к аргументу f 1 и '% g ' указывает что аргумент является вещественным числом.

Команда set(handles.edit4,'String',S); означает что в элемент интерфейса edit 4 (окошко вывода текста) будет выведена строка символов содержащаяся в переменной S.

Построение графика. Для построения графика предназначена кнопка интерфейса Plot. Логика построения графика такова

% --- Executes on button press in pushbutton2. PLOT

function pushbutton2_Callback(hObject, eventdata, handles)

 [VectorArg]=VvodArg(hObject, eventdata, handles);

PostrGraf(VectorArg,hObject, eventdata, handles);

Пользователь вводит в окошки ввода значения переменных NumFun (номер функции 1, 2 или 3), NumArg (номер аргумента), MinArg (минимальное значение аргумента, с него начинаются подписи к горизонтальной оси), MaxArg (максимальное значение аргумента, до него идут подписи к горизонтальной оси), StepArg (шаг изменения аргумента). Затем пользователь нажимает кнопку Plot и происходит построение графика в соответствии с введенными данными.

В М-файле опишем соответствующий этой кнопке абзац текста. После нажатия на кнопку вызывается функция VvodArg, считывающая исходные аргументы и возвращающая вектор их значений. Потом вызывается функция PostrGraf. Ей передается вектор аргументов. Она строит график. Для построения графика функция PostrGraf считывает из окошек текстового ввода интерфейса соответствующие переменные. Затем подсчитывает число шагов, вычитая минимальное значение из максимального и деля на величину шага.

function[]=PostrGraf(VectorArg,hObject, eventdata, handles)

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

NumArg=str2double(get(handles.edit11,'String'));

MinArg=str2double(get(handles.edit12,'String'));

StepArg=str2double(get(handles.edit13,'String'));

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

NumberSteps=round((MaxArg-MinArg)/StepArg);

horis(1)=MinArg;

VectorArg(NumArg)=horis(1);

[VectorRes]=ReshitZadachu(VectorArg);

vert(1)=VectorRes(NumFun);

for i=2:NumberSteps+1

   horis(i)=horis(i-1)+StepArg;

   VectorArg(NumArg)=horis(i);

   [VectorRes]=ReshitZadachu(VectorArg);

   vert(i)=VectorRes(NumFun);

end

plot(horis,vert,'o-');

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

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

При этом команда round округляет до целого значения результат деления. NumberSteps=round((MaxArg-MinArg)/StepArg); после этого для каждого элемента массива горизонтальных координат horis точек графика и для каждого элемента массива вертикальных координат vert точек графика определяются значения. Когда все готово (рис.1.64), то команда plot строит график и затем на график накладывается координатная сетка.

Рис.1.64.Пример использования программы с графическим интерфейсом, строящей график и выводящей вычисленные значения.

Вычислить и сохранить результаты. Для того, чтобы вычислить результаты и сразу же сохранить их в файл, предназначена кнопка Calculate & Save.

В соответствующем этой кнопке тексте программы, происходит открытие файла

[f,p]=uiputfile('Путь к файлу\Имя файла.расширение', 'Окно выбора'); где среди возвращаемых значений p путь, f имя файла. После получения этих возвращаемых значений функции uiputfile, следует объединить эти данные с помощью команды KudaZapisat=strcat(p,f); дальнейшие действия так же, как в ранее рассмотренных упражнениях о работе с файлами.

% --- Executes on button press in pushbutton3. CALCULATE & SAVE

function pushbutton3_Callback(hObject, eventdata, handles)

%CALCULATE

[VectorArg]=VvodArg(hObject, eventdata, handles);

[VectorRes]=ReshitZadachu(VectorArg);

%OPEN FILE WT

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

KudaZapisat=strcat(p,f);

f=fopen(KudaZapisat,'wt');

%SAVE VALUES OF ARGUMENTS AND RESULTS

for i=1:3

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

end

for i=1:3

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

end       

%sohranit v fail resultati vichislenij

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

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

TextString=strcat('Funct_#1\t','Funct_#2\t','Funct_#3\n');

fprintf(f,TextString);

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

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

fprintf(f,'%g\n',VectorRes(3));

%sohranit v fail ishodnije argumenti

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

TextString=strcat('argument#1_x\t','argument#2_y\t','argument#3_z\n');

fprintf(f,TextString);

for i=1:3

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

end

fclose(f);

На рис.1.65 приведен пример окна интерфейса, которое при этом откроется.

Рис.1.65.Окно выбора пути и имени файла перед сохранением.

Построить и сохранить график. Для того, чтобы построить график и сразу же сохранить его, предназначена кнопка Plot & Save.

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

Затем, когда все переменные, описывающие график, определены, то открываем файл.

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

% --- Executes on button press in pushbutton4. PLOT & SAVE

function pushbutton4_Callback(hObject, eventdata, handles)

%PLOT   

[VectorArg]=VvodArg(hObject, eventdata, handles);  

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

NumArg=str2double(get(handles.edit11,'String'));

MinArg=str2double(get(handles.edit12,'String'));

StepArg=str2double(get(handles.edit13,'String'));

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

NumberSteps=round((MaxArg-MinArg)/StepArg);

horis(1)=MinArg;

VectorArg(NumArg)=horis(1);

[VectorRes]=ReshitZadachu(VectorArg);

vert(1)=VectorRes(NumFun);

for i=2:NumberSteps+1

   horis(i)=horis(i-1)+StepArg;

   VectorArg(NumArg)=horis(i);

   [VectorRes]=ReshitZadachu(VectorArg);

   vert(i)=VectorRes(NumFun);

end

plot(horis,vert,'o-');

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

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

%OPEN FILE WT

[f,p]=uiputfile('C:\MATLAB701\work\exGuide_1Graf.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',horis(i));

end

fprintf(f,'\n');

for i=1:(NumberSteps+1)

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

end

%zapisivajem argumenti

for i=1:3

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

end

fprintf(f,'%g\t',NumFun);

fprintf(f,'%g\t',NumArg);

fclose(f);

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

Рис.1.66.Окно выбора папки и файла перед открытием.

function[]=VivodArgumentovNaEkran(VectorArg,hObject, eventdata, handles);  

x=VectorArg(1);

y=VectorArg(2);

z=VectorArg(3);

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

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

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

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

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

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

Функция uigetfile подготавливает данные об открываемом файле для чтения. При этом открывается окно выбора, где определяется имя файла и путь к нему. Эти данные являются возвращаемыми значениями для функции uigetfile. Получив их, объединяем их в одну переменную OtkudaChitat. Затем открываем файл. После открытия файла, считываем интересующие нас данные из файла в переменные с соответствующими названиями.

% --- Executes on button press in pushbutton5. OPEN DATA

function pushbutton5_Callback(hObject, eventdata, handles)

%OPEN FILE RT

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

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila

for i=1:3

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

end

for i=1:3

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

end

fclose(f);

%vivod na ekran

VivodRes(VectorRes,hObject, eventdata, handles);

VivodArgumentovNaEkran(VectorArg,hObject, eventdata, handles); 

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

Открыть график и данные из файла. Открытие данных, необходимых для построения графика, из файла осуществляется кнопкой Open Data & Plot.

% --- Executes on button press in pushbutton6. OPEN DATA & PLOT

function pushbutton6_Callback(hObject, eventdata, handles)

%otkrit grafic is faila

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

OtkudaChitat=strcat(p,f);

f=fopen(OtkudaChitat,'rt');

%chitat is faila

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

for i=1:NumberSteps+1

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

end

for i=1:NumberSteps+1

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

end

for i=1:3

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

end 

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

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

fclose(f);

%stroim grafic

plot(horis,vert,'o-');

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

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

%vivod na ekran

VivodArgumentovNaEkran(VectorArg,hObject, eventdata, handles); 

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

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

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

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

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

Пример 1. Рассмотрим упражнение по созданию простейшего интерфейса и функций, исполняемых по нажатиям на кнопки (Рис.1.67) и обеспечивающих:

· Считывание исходных аргументов;

· Вычисление новых значений (формулы для этого даются в условии);

· Вывод на экран результатов (вычисленных новых значений).

Рис.1.67. Создание простейшего интерфейса и функций, исполняемых по нажатиям на кнопки

Интерфейс создадим с помощью команды guide, введя ее в командном окне. Выберем в открывшемся окне создание нового интерфейса. Построим его, как показано ниже.

Затем подготовим функции для ввода данных, для вычисления значений и для вывода вычисленных значений на экран.

Соответственно, нам понадобятся три разные функции. Их описания разместим выше чем описание действий, выполняемых по нажатию на кнопку.

Для ввода данных опишем функцию VvodArg, она возвращает вектор аргументов.

function[VectorArg]=VvodArg(hObject, eventdata, handles)

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

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

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

VectorArg=[x, y, z];

При выполнении функции происходит при помощи функции str 2 double преобразование строки считанных из окна интерфейса символов в число. Строку символов она получает от функции get, непосредственно осуществляющей считывание из окна интерфейса. Ее аргумент handles. edit 1 это окно интерфейса, которое называется Edit 1, это название можно увидеть если правой кнопкой мышки открыть, щелкнув на этом окне, его редактор свойств и поискать там переменную Tag. Второй аргумент функции get называется String, его можно увидеть также в редакторе свойств. Рядом с ним в редакторе свойств указано его значение. По умолчанию там стоит Text Edit 1, но при создании интерфейса оно было удалено нами, чтобы в окне не было этой ненужной надписи. После того, как пользователь впишет в окно новое число (значение исходной переменной), то переменная String будет содержать строку этих символов или один символ.

Введенные значения переменных помещаются затем в вектор аргументов. Он и будет возвращаемым значением функции.

Для вычисления новых значений опишем функцию ReshitZadachu.

function[VectorRes]=ReshitZadachu(VectorArg)

x=VectorArg(1);

y=VectorArg(2);

z=VectorArg(3);

f1=x^2+y+z;

f2=x+y^2+z;

 f3=x+y+z^2;

VectorRes=[f1, f2, f3];

Она получает как аргумент вектор аргументов и возвращает вектор результатов.

При выполнении функции, вычисляются новые значения и затем они помещаются в вектор результатов, который и будет возвращаемым значением функции.

Для вывода результатов на экран, опишем функцию VivodRes.

function[]=VivodRes(VectorRes,hObject, eventdata, handles)

f1=VectorRes(1);

f2=VectorRes(2);

f3=VectorRes(3);

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

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

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

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

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

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

Она получает среди прочих (связанных с интерфейсом) аргументов вектор результатов вычислений. Функция VivodRes обеспечивает вывод в окно интерфейса с помощью функции set, которой в качестве аргументов передаются handles. edit 4, означающий элемент интерфейса—окно вывода edit 4, куда в принадлежащую этому окну переменную String, указанную как второй аргумент, будет помещена строка символов, содержащаяся в третьем аргументе—переменной S.

В свою очередь, переменная S получила эту строку символов в качестве возвращаемого значения функции sprintf. А этой функции были переданы аргументы, указывающие что необходимо из переменной f 1 получить строку символов, первоначально являвшуюся числом (на это указывает аргумент ‘% g ’).

Теперь, когда описаны все необходимые функции, приступим к описанию действий, происходящих после нажатия на кнопку. Эта кнопка имеет название (Tag) которое можно прочитать в ее инспекторе свойств правой кнопкой мышки. Это название pushbutton 1. Соответственно, в файле, наряду с описаниями всех прочих элементов интерфейса, автоматически сгенерирован и абзац текста, озаглавленный function pushbutton 1_ Callback.

% --- Executes on button press in pushbutton1. CALCULATE

function pushbutton1_Callback(hObject, eventdata, handles)

 [VectorArg]=VvodArg(hObject, eventdata, handles);

[VectorRes]=ReshitZadachu(VectorArg);

VivodRes(VectorRes,hObject, eventdata, handles);

Запишем туда вызовы функций, которые последовательно обеспечат ввод данных, вычисление результатов и вывод их на экран.

Пример 2. Рассмотрим задачу о вводе матрицы и сохранении ее в файл. Начнем с создания интерфейса, изображенного на Рис.1.68.

Рис.1.68.Ввод матрицы и сохранение ее в файл.

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

Опишем действия, выполняемы после нажатия на кнопку ввода размерностей матрицы. Она называется pushbutton1.

% Executes on button press in pushbutton1. INPUT MATRIX DIMENSIONS

function pushbutton1_Callback(hObject, eventdata, handles)

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

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

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

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

end

После ее нажатия, выводятся в окошки для вывода номера строки и столбца очередного элемента матрицы, в каждое окно, по единице. Таким образом, интерфейс готов к вводу элемента матрицы, расположенного в первой строке и первом столбце.

Опишем действия, происходящие после нажатия на кнопку ввода элемента матрицы. Это кнопка pushbutton2.

%Executes on button press in pushbutton2. INPUT NEW MATRIX ELEMENT

function pushbutton2_Callback(hObject, eventdata, handles)

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

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

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

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

Matrix=str2num(get(handles.edit6,'String')); 

if i<=NumberRows   

if j<=NumberColumns       

   Matrix(i,j)=str2double(get(handles.edit3,'String'));

   S=mat2str(Matrix);

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

   if j<NumberColumns

       b=j+1;

       a=i;

   else

       b=1;

       a=i+1;

   end

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

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

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

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

   j=j+1;

   S=sprintf('%s',' ');

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

end

i=i+1;

end 

end

Сначала происходит считывание размерностей матрицы, а также номера строки и номера столбца вводимого элемента матрицы из окошек, где они указаны.

Затем матрица считывается из окна, где она видна вся (то есть те ее элементы, которые уже введены, если таковые вообще есть). Это делается функцией str2num, преобразующей строку в матрицу (содержимое окна считается строкой символов).

После этого, проверив, что размерность матрицы не превышена, считывается очередной элемент матрицы из окошка, где он указан.

Затем матрица, дополненная этим новым элементом, преобразуется в строку функцией mat2str.

После этого строка, состоящая из элементов матрицы, выводится в окно функцией set. Затем выполняются изменения значений переменных, соответствующих номеру строки и столбца следующего ожидаемого для ввода элемента матрицы.

После этого они выводятся в окна, где указаны номер строки и столбца ожидаемого элемента матрицы. Теперь все готово к очередному циклу ввода элемента матрицы. То есть осталось его впечатать в соответствующее окно и нажать кнопку.

Опишем действия, происходящие после нажатия на кнопку Сохранить. Это кнопка pushbutton3.

Сначала считываются размерности матрицы и сама матрица из соответствующих окон. Затем открывается окно выбора файла для записи туда сохраняемой матрицы. Это окно открывается функцией uiputfile. Ее аргументами являются предполагаемый по умолчанию путь/имя файла, а также вызов самого окна выбора, указанного как второй аргумент функции uiputfile.

% --- Executes on button press in pushbutton3. SAVE

function pushbutton3_Callback(hObject, eventdata, handles)

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

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

Matrix=str2num(get(handles.edit6,'String'));

%OPEN FILE WT

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

KudaZapisat=strcat(p,f);

f=fopen(KudaZapisat,'wt');

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

%SAVE VALUES OF ARGUMENTS AND RESULTS

for i=1:NumberRows

   for j=1:NumberColumns

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

   end

   fprintf(f,'\n');

end

fclose(f);

 end

Возвращаемые значения этой функции это файл и путь к нему, выбранные пользователем в окне выбора. Поместим их в переменную KudaZapisat, предварительно соединив в одну строку символов функцией strcat.

Теперь передадим эту строку в функцию fopen, открывающую файл, а вторым аргементом ее будет ‘wt’, означающее, что файл открывается для записи. Функция fopen вернет в качестве возвращаемого значения переменную, к которой можно теперь обращаться как к файлу.

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

Потом в цикле запишем в файл элементы матрицы, разделяя их табуляцией и по мере надобности переводя строку. Затем с помощью функции fclose закроем файл.

Пример 3. Рассмотрим задачу ввести экспериментальные данные и построить график (Рис.1.69).

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

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

Для построения графика предусмотрим кнопку и окно графика.

Опишем, что происходит после нажатия на какую-либо из кнопок выбора, какую из серий данных будем вводить. Это кнопки pushbutton1, pushbutton2 и pushbutton3. При нажатии происходит следующее. Ставятся в окошки, показывающие порядковый номер вводимого элемента данных и номер строки (окна интерфейса), где эти данные отображаются, соответственно единица и порядковый номер от 1 до 3.

Рис.1.69. Ввод массивов данных и построение графика

% --- Executes on button press in pushbutton1.

function pushbutton1_Callback(hObject, eventdata, handles)

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

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

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

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

end

% --- Executes on button press in pushbutton2.

function pushbutton2_Callback(hObject, eventdata, handles)

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

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

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

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

end

% --- Executes on button press in pushbutton3.

function pushbutton3_Callback(hObject, eventdata, handles)

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

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

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

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

end

Опишем, что происходит после нажатия на кнопку ввода нового элемента в серии экспериментальных данных. Это кнопка pushbutton4.

% Executes on button press in pushbutton4. INPUT NEW DATA

function pushbutton4_Callback(hObject, eventdata, handles)

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

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

if NumberString==1

Matrix=str2num(get(handles.edit4,'String'));

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

S=mat2str(Matrix);

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

end

if NumberString==2

Matrix=str2num(get(handles.edit5,'String'));

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

S=mat2str(Matrix);

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

end

if NumberString==3

Matrix=str2num(get(handles.edit6,'String')); 

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

S=mat2str(Matrix);

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

end

S=sprintf('%g',Number+1);

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

S=sprintf('%s',' ');

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

end

Сначала считываются из соответствующих окошек интерфейса номер элемента и номер серии данных, затем, в зависимости от их значений, выбирается соответствующий набор данных в строке в окне интерфейса, считывается функцией str2num преобразующей строку символов в вектор чисел.

После этого считывается новый вводимый элемент данных из соответствующего ему окна интерфейса и добавляется к вектору данных. Потом вектор числовых значений преобразуется функцией mat2str в строку символов. Затем эта строка помещается в соответствующее ей окно интерфейса.

Опишем, что происходит после нажатия на кнопку построения графика. Это кнопка pushbutton5.

% --- Executes on button press in pushbutton5.GRAPHIC  

function pushbutton5_Callback(hObject, eventdata, handles)

x1=str2num(get(handles



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 36; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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