Практикум по матлабу. практикум по матлабу. Физических процессов с использованием
Скачать 1.13 Mb.
|
.m, который содержит последовательность операторов MAT- LAB. Наберите приведенный далее текст или модифицируйте протокол своей ра- боты (который вы можете получить с помощью команды diary). 10 %%%%%%%%%%%%%%%%%%%%%%%%%% % Второй вариант расчета фигур Лиссажу % %%%%%%%%%%%%%%%%%%%%%%%%%% % Задание коэффициентов a1=1.2; a2=1.0; w2=1.0; % Задание значений вектора t t=0:0.1:15; x=a1*cos(w2*t); % Задание разных частот w1 w1=1.25:0.25:2.0; % Цикл вывода разных графиков на одном листе for k=1:4, y=a2*cos(w1(k)*t); % Задание вектора-строки вывода надписей s=[’w1/w2=’ num2str(w1(k))]; % Вывод разных графиков в разных местах листа (экрана) % Оператор subplot задает место на листе, где % график будет нарисован последующей командой subplot(2,2,k); plot(x,y); title(s); end; Написанная выше программа-сценарий имеет несколько новых операторов. Опе- ратор s=[’w1/w2=’ num2str(w1(k))]; можно для большей ясности предста- вить в виде нескольких операторов s1=’w1/w2’ – формирование вектор-строки, каждый элемент которой является символом, т.е. формирование строки текста. Опе- ратор s2=num2str(w1(k)) – формирование строки текста с помощью функ- ции num2str, которая превращает числовую переменнную w1(k) в ее строковое представление. Пусть, например, w1(1)=2.34, тогда оператор s2=num2str(w1(1)) эквивалентен присвоению s2=’2.34’. И последнее действие – объединение двух векторов s1 и s2 в один с помощью конструкции вида s=[s1 s2]. Таким образом можно явно задавать вектора и матрицы (см. Дополнение, п. 2 ), причем элемен- тами, стоящими внутри квадратных скобок, могут быть как числа или буквы, так и целые вектора и даже матрицы. Созданная описанным образом строковая переменная s используется впослед- ствии в операторе title в качестве аргумента, в результате чего у каждого подри- сунка появляется свой заголовок. Новым в приведенной программе является также оператор цикла for...end и оператор subplot(m,n,k), который позволяет на одном рисунке создать матри- цу из mxn отдельных рисунков, причем параметр k определяет номер рисунка по 11 −2 −1 0 1 2 −1 −0.5 0 0.5 1 w1/w2=1.25 −2 −1 0 1 2 −1 −0.5 0 0.5 1 w1/w2=1.5 −2 −1 0 1 2 −1 −0.5 0 0.5 1 w1/w2=1.75 −2 −1 0 1 2 −1 −0.5 0 0.5 1 w1/w2=2 Рис. 3. Одновременный вывод 4 фигур Лиссажу. порядку слева направо и сверху вниз. Результат использования программы пока- зан на рис. 3 . Заметим, что в исходном тексте программы представлены фигуры Лиссажу не самого общего вида. Задание 2. Включите начальные фазы ϕ 1 и ϕ 2 в аргументы косинусов, т.е. cos(ω 1 t ) замените на cos(ω 1 t + ϕ 1 ) и cos(ω 2 t ) на cos(ω 2 t + ϕ 2 ). Задание 3. Еще одна модификация программы – замена процедуры plot на процедуру comet – позволит изображать «бегущий» участок кривой (см. Дополнение, п. 8.1 ) и анализировать, сколько раз точка пробегает кривую при изменении времени t в заданном интервале. 2.2. Биения Вторая программа для первого занятия изображает кривую y (t) = a 1 cos ω 1 t + a 2 cos ω 2 t. 12 Несмотря на простоту формулировки, эта задача очень содержательна. В процессе исполнения программы Beats на экран выводится участок кривой y (t) для интер- валов времени t от t 0 до t m . Исходный текст программы: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Учебная программа расчета биений % % Это вариант с выводом полной кривой биений % % и перемещением по ней с помощью команды AXIS % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; a1=1.0; % Амплитуды гармонических a2=1.0; % колебаний w1=1.0; % Частоты гармонических w2=1.2; % колебаний t0=0; % Начальный момент времени tm=20; % Конечный момент времени N=600; % Число точек вывода/расчета T=tm-t0; % Время вывода биений dt=T/N; % Шаг по времени t=t0:dt:tm; % Вектор времени y=a1*cos(w1*t)+a2*cos(w2*t); % Функция биений plot(t,y); % Вывод графика %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% После вывода результата расчета на экран можно изменить масштаб осей с повторным выводом соответствующего участка кривой. Так, в приведенном выше примере переменная t на графике будет изменяться от 0 до 20. Если мы хотим рас- смотреть подробности графика в другом диапазоне (например, по t от 1 до 2), то необходимо ввести в командном окне команду axis([xmin xmax ymin ymax]), где xmin xmax -диапазон вывода по оси x, а ymin ymax -диапазон выво- да по оси y. В результате выполнения этого оператора график будет перестроен в указанном масштабе 4 Задание 1. Частота биений при сложении двух гармонических колебаний равна разности их частот. Повторится ли через период биений после наибольшего максимума в одном всплеске биений наибольший максимум в следующем? 4 Следует иметь в виду, что построение нового графика идет на основе все тех же насчитан- ных массивов t и y, поэтому если в выбранный диапазон попадет мало точек, то и качество графика будет невысокое. 13 Задание 2. Будет ли синусоидой «огибающая максимумов» при неравных друг другу амплитудах складываемых колебаний? Задание 3. Другого вида биения можно наблюдать при ω 1 ω 2 . Для того что- бы увидеть, как действительно выглядят колебания в этом случае, желательно увеличить время вывода биений (т.е. диапазон изменения переменной t) при- мерно в 10-20 раз. 2.3. Графический интерфейс в задаче «Биения» Для решения многих учебных и научных задач очень часто бывает удобно не менять (даже так удобно, как в MATLAB) данные внутри программы с последующим ее запуском, а менять каким-либо образом исходные данные, не прекращая при этом наблюдать за тем, как изменяется график соответствующего решения. Для реали- зации такого способа взаимодействия с программой (интерактивного интерфей- са) удобно иметь на экране одновременно окно вывода графической информации, «кнопки управления» и окошки «редактирования» данных (рис. 4 ) 5 При выполнении задачи о биениях вы получаете готовое решение, в котором уже создано окно интерфейса (функция Interface_Window) и частично решение задач организации связи с вычислительной программой. При этом две функции (Drive_Beats и Run_Problem) при выполнении заданий вам придется видоизме- нять. При запуске задачи мы будем вызывать программу Drive_Beats, а из нее бу- дут вызываться остальные функции. В этой программе определяются начальные значения параметров (амплитуд, частот и т.п.). Они будут далее передаваться в функцию, содержащую основной, расчетный алгоритм задачи – Run_Problem. Параметры, которые не меняются в процессе исследования, можно передавать из этой программы с помощью глобальных переменных (а можно просто задать их в Run_Problem). Те же параметры, которые необходимо менять при исследовании режимов расчета («редактируемые» переменные), передаются специальным обра- зом, описанным далее. Для исходного варианта задачи «Биения» передаваемыми параметрами явля- ются: амплитуды a 1 , a 2 , частоты ω 1 и ω 2 , начальный момент времени вывода t 1 и конечный момент вывода t 2 5 Для разработки такого интерфейса в MATLABимеется специальный пакет, который на- зывается GUI – Graphics User Interface (графический интерфейс пользователя). О работе с этим пакетом рассказывается в Дополнении (п. 9 ). При выполнении данной задачи обращаться к нему не потребуется. 14 Рис. 4. Вид экрана при использовании разработанного графического интерфейса в задаче о биениях. Рассмотрим примерную программу Drive_Beats %%%%%%%%%%%%%%%%%%%%%%%%%%% % Это процедура для запуска BEATS % %%%%%%%%%%%%%%%%%%%%%%%%%%% clear; % Первоначальная очистка рабочего пространства % Задание начальных значений рабочих переменных a1=1; a2=1; w1=1; w2=1.2; t1=0; t2=20; N=600; % Переменную N объявляем глобальной global N; % Занесение начальных значений в транспортный массив VALUE(1)=a1; VALUE(2)=a2; VALUE(3)=w1; VALUE(4)=w2; VALUE(5)=t1; VALUE(6)=t2; % Занесение имен передаваемых переменных 15 % в транспортный массив NAME(1,:)=’ a1’; NAME(2,:)=’ a2’; NAME(3,:)=’ w1’; NAME(4,:)=’ w2’; NAME(5,:)=’ t1’; NAME(6,:)=’ t2’; % Вызов процедуры графического интерфейса и передача % транспортных массивов Interface_Window(VALUE, NAME, ’Run_Beats’) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% При разработке подобной программы для любой задачи необходимо иметь в виду: 1. Имена массивов (в примере – это массивы VALUE и NAME) могут быть любыми; 2. Размер (число строк) у массивов VALUE и NAME должны совпадать; 3. При задании строк-имен в массиве NAME длина строк (включая пробелы) должна быть одинаковой для всех переменных, желательно не более 8 симво- лов; 4. Имя программы (m-файла), которое стоит в обращении, может быть лю- бым – это имя основной, исполнительной программы. В нашем примере – это Run_Beats Программа Drive_Beats вызывает функцию Interface_Window – основную функцию графического интерфейса. Эта функция строит изображение окна ин- терфейса на экране и помещает значения параметров, заданных в вызвавшей ее программе (в данном случае – в Drive_Beats), в «буферный объект» по имени ’UserData’. Далее ее действия зависят от нажатия мыши на кнопках интерфейс- ного (графического) экрана или – при редактировании передаваемых данных – в специальных окнах редактирования. Для редактирования (изменения) параметров задачи необходимо щелкнуть мы- шью в окошке численного значения данных, после чего эти численные значения можно изменять. Новые значения заносятся в буфер ’UserData’. При нажатии кнопки Run запускается программа Run_Beats. При этом пара- метры она получает из ’UserData’. Графики, создаваемые программой Run_Beats, 16 строятся в графическом окне, созданном для этого программой Interface_Window. При завершении построения графика или работы программы Run_Beats програм- ма Interface_Window проверяет, не было ли сигнала от мыши 6 , и если был, то переходит к соответствующим действиям. При нажатии кнопки Exit программа завершает свою работу, а рисунок удаля- ется с экрана. Run_Beats-функция, к которой происходит обращение, при нажатии кнопки RUN. Как правило -это функция, содержащая основной алгоритм расчета зада- чи. Имя этой m-функции (совпадающее с именем файла) должно быть передано функции Interface_Window в качестве третьего параметра в виде текстовой стро- ки. Рассмотрим примерную программу Run_Beats. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Функция, выполняющая действия по нажатию кнопки RUN % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function r=Run_Beats() % Задание параметров, не передающихся через меню, % или их передача через механизм GLOBAL из головной % программы global N; % Идентификация текущего графика и определение % его дескриптора h0=gcf; % Извлечение совокупности передаваемых данных, % хранящихся в UserData info=get(h0,’Userdata’); % Запись извлеченных данных в локальные переменные a1=info.VALUE(1); w2=info.VALUE(2); w1=info.VALUE(3); w2=info.VALUE(4); t1=info.VALUE(5); t2=info.VALUE(6); % Подготовительные вычисления для реализации 6 По правде говоря, программа Interface_Window работает при этом совместно с другими, но это не существенно для ее использования. 17 % основного алгоритма tm=t2-t1; % Время вывода биений dt=tm/N; % Шаг по времени % Расчет биений t=t1:dt:t2; % Вектор времени y=a1*cos(w1*t)+a2*cos(w2*t); % Функция биений % Организация графического вывода результатов cla; % Очистка области вывода axis([t1 t2 -2 2]); % Задание осей hl=line(t,y); % Вывод графика set(hl,’color’,’b’); % Задание цвета линии %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Заметим, что при исполнении программы Interface_Window в объект ’UserData’ был занесен массив VALUE с помощью записи info.VALUE, который и извле- кается в функции Run_Beats с помощью оператора info=get(gcf,’Userdata’). Для работы интерактивного графического интерфейса необходимо включить в свою рабочую директорию (в которой вы разрабатываете свои программы) еще две заранее приготовленные функции Edit_Value.m и Exit_Problem.m. Задание 4. Изучите влияние второй и третьей гармоник на форму колебания. Для этого удобно выбрать функцию y (t) в форме y (t) = a 1 · cos(ωt) + a 2 · cos(2ωt + ϕ 2 ) + a 3 · cos(3ωt + ϕ 3 ) и контролировать амплитуды a 2 , a 3 и фазы ϕ 2 , ϕ 3 2.4. Волны Речь может идти о самых разных волнах – волнах на поверхности воды, звуке, радиоволнах и т.п. Если амплитуды волн не слишком велики, то для них справедлив принцип суперпозиции, что мы и будем предполагать. Функция y (x, t) = a cos(kx − ωt) задает бегущую волну с амплитудой a, волновым числом k и угловой частотой ω. Длина волны λ = 2π/k, а ее период T = 2π/ω. Скорость волны (скорость максимума, определяемого условием kx − ωt = 0) равна v = x/t = ω/k. Суперпозиция двух волн y (x, t) = a 1 cos(k 1 x − ω 1 t ) + a 2 cos(k 2 x − ω 2 t ) (1) 18 в любой момент представляет картину биений в зависимости от x. При a 2 = a 1 y (x, t) = a(x, t) cos(kx − ωt), где a (x, t) = 2a 1 cos(dk x − dω t), k = 1 2 (k 1 + k 2 ), ω = 1 2 (ω 1 + ω 2 ), dk = 1 2 (k 1 − k 2 ), dω = 1 2 (ω 1 − ω 2 ). Функция |a(x, t)| определяет модуляцию суммарной волны; она перемещается со скоростью u = dω/dk, называемой групповой скоростью. Программа Wavepak изображает сумму волн, причем изображение на экране сменяется с определенным шагом по времени т.е. осуществляется анимация изоб- ражения. Прежде чем подробно анализировать приведенную далее программу вы- вода бегущей волны, сделаем несколько общих замечаний относительно графики в системе MATLAB. Подробнее с особенностями графики в системе MATLAB можно познакомиться в Дополнении (п. 8 ) и в [ 1 , 2 , 3 , 5 ]. 2.4.1. Основные графические объекты и их использование Дело в том, что функции, реализующие те или иные действия по созданию гра- фических объектов, а также сами эти объекты (такие как линии, оси, надписи и т.д.) фактически являются объектами (подробнее см. Дополнение, п. 8.4 ) в смысле объектно-ориентированного программирования. В то же самое время большинство из них можно использовать как обычные функции, ничего не зная об их особенной природе. При реализации же анимации приходится использовать эти особенности, поэтому мы должны вкратце познакомиться с ними. Существует иерархия объектов: рисунок (figure), оси координат (axes), ли- ния (line). Обычно старшие объекты называют «родителями», а младшие – их «детьми». Существуют и другие объекты, но нам пока понадобятся только эти. Всякий объект имеет дескриптор, которым он однозначно определяется 7 , и набор свойств, таких как цвет, размер, способ вывода и т.д. Полный список свойств лю- бого объекта можно посмотреть с помощью системы помощи. Многие свойства, без которых объекты не могут существовать, имеют свои значения по умолчанию. По- этому можно вызывать объекты, не указывая никаких свойств, кроме обязатель- ных. Например, для функции line обязательно указать два массива x и y – коор- динаты соединяемых точек. Для задания и/или изменения каких-либо свойств ис- 7 Лучше подошло бы отечественное слово ярлык , имеющее кроме смысла «метка» еще и исторический смысл – «ярлык на управление», созвучный с английским handle. 19 |