Введение
Для решения задач из типового расчета и написания программ используется язык программирования Matlab. Это пакет прикладных программ для решения задач технических вычислений и одноимённый язык программирования, используемый в этом пакете. Maltab хорошо подходит для начального ознакомления с основами программирования, т.к. был разработан для решения математических задач.
1 Основная часть
Задание 1. Программирование формул и управление виртуальным графопостроителем.
Цель работы
Научиться оформлять формулы в соответствии с синтаксисом языка МатЛаб и использовать виртуальный графопостроитель.
Задача
1. Написать m-функцию, возвращающую значение заданного выра-
жения при произвольных значениях величин x, n (вход-
ные параметры). При этом использовать вспомогательную m-функцию,
возвращающую значение выражения, стоящего под знаком суммы или
произведения, т.е. возвращающую значение k-го слагаемого в сумме или,
соответственно, k-го сомножителя в произведении. Проверить правильность программы для каких-либо подходящих значений x и n.
2. Воспользовавшись этой m-функцией как вспомогательной, запро-
граммировать построение графика (по равноотстоящим промежуточным
точкам) соответствующей математической функции аргумента x на от-
резке [a, b] при фиксированном значении параметра n. Построение гра-
фика предполагается с помощью виртуального графопостроителя. Таким образом, построенный график будет представлять собой некоторую ломанную кривую. При достаточно большом числе промежуточных точек эта ломаная может выгля-
деть как плавная кривая, однако этого добиваться не нужно. Программа
должна запрашивать ввод значений следующих величин: 1) число слага-
емых (сомножителей) в выражении для функции, 2) концы отрезка, на
котором строится график функции, 3) число точек этого отрезка, по ко-
торым должен быть построен график, и после их ввода строить уже гра-
фик. Для организации диалога с пользователем программы использовать
встроенную функцию INPUT, для построения графика использовать гра-
фопостроитель. Проверить работу программы при значениях первых трех из этих параметров, указанных в таблице, а число промежуточных точек графика взять произвольно в пределах от 5 до 10.
3. Дополнить программу вычерчиванием горизонтальной линии на уровне среднего
арифметического значений функции в промежуточных точках (в преде-
лах отрезка [a, b]).
4. Доработать программу еще так, чтобы во время построения графика (все в том же цикле) те его точки, в которых он пересекает ось среднюю линию, выделялись квадратиками. Для реализации этого вспомогательного алгоритма воспользоваться действием графопостроителя — VECTOR.
Решение
x, n – входные данные.
Находим значение выражения под знаком суммы.
Домножаем значение суммы на выражение за знаком суммы.
Исходный код
function y=m1(x,n)
%ИСХ: x – число от 0 до 1. n – число сумм.
%Формула
для вычислений: y=
%РЕЗ: y – результат вычисления формулы.
y=0; %Начальное значение функции
s=summa(x,n); %Находим значение сумм.
y=0.05*sqrt(n+abs(x))*s;
end
function s=summa(x,n)
%ИСХ: x – число от 0 до 1. n – число сумм.
%РЕЗ: s – результат суммирования.
s=0;
for i=1:n
s=s+(exp(i+sqrt(x))*cos(2*x/i))^(1/i);
end
end
_______________________________________________________________________
function risui
a=input('Введи левая граница a=');% Левая граница
b=input('Введи правая граница b=');% Правая граница
n=input('Введи число слогаемых n=');% Число слогаемых
ch=input('Введи число точек графика ch=');%Число точек графика
p=Pero(a,m1(a,n)) %создаем графопостроитель
h=(b-a)/(ch-1); % Определяем шаг h
line=0; %Значения функции для построения средней линии
%строим график
for i=a:h:b
l=m1(i,n);
p.punct(i, l)
line=line+l; %Значения функции
end
%График функции:
p.draw
sr=line/ch; % Находим среднее значение
p.set('lineColor', 'w') % делаем линию невидимой
p.punct(a,sr) % Ставим "точку" в нужное место
p.draw
p.set('lineColor', 'b') % Делаем цвет видимым
vich(p,a,b,h,n,sr) %Рисует среднюю линию, ищет пересечения со средней линией
%Ищем место пересечения средней линии с графиком функции:
function vich(p,a,b,h,n,sr) % х - значение "х"
for i=a:h:b
l=m1(i,n); % l=y1 x1=i
m=m1(i+h,n);% m=y2 x2=i+h y0=sr
if i+h>b
break
end
p.punct(i,sr)
if (l<=sr) && (m>=sr)
p.set('lineColor', 'b') % Ставим цвет
CB=h*(sr-l);
CB=real(CB)/real(m-l);
p.punct(i+CB,sr) %i+h-CB - новая точка, где нужен квадратик. sr - значение средней линии
p.draw
kvadrat(p)
end
p.draw
end
function kvadrat(p)
% ИСХОДНО:
% 1) перо находится в точке, вокруг которой требуется
% начертить квадратный маркер
% 2) цвет чернил синий (цвет основной линии графика)
% РЕЗУЛЬТАТ:
% 1) перо в исходной точке
% 2) цвет чернил синий
% 3) начерчен квадрат зеленого цвета с центром в исходной
% точке и со стороной равной... (размер выбрать самостоятельно)
p.set('lineColor', 'w') % делаем линию невидимой
p.vector(0.05,0.05) % Ставим точку в начало квадрата
p.draw
p.set('lineColor', 'g') % рисуем квадратик
p.vector(-0.1,0)
p.vector(0,-0.1)
p.vector(0.1,0)
p.vector(0,0.1)
p.draw
p.set('lineColor', 'w') % делаем линию невидимой
p.vector(-0.05,-0.05) %возвращаем точку в начальное положение
p.draw
p.set('lineColor', 'b') % возвращаем нужный цвет
Пример работы
а)

б)

Задание 2. Использование рекуррентных соотношений для суммирования степенных рядов.
Цель работы
Научиться использовать рекуррентные соотношения.
Задача
1. Исходя из заданной в варианте формулы для n-го члена ряда, по-
лучить одно или несколько рекуррентных соотношений позволяющих
последовательно вычислять все члены ряда (в этих соотношениях уже
не должно быть ни факториалов, ни многоточий, ни переменных степе-
ней). Проверить полученные рекуррентные соотношения, вычислив пер-
вые 2—3 члена ряда и сравнив результаты с исходной не рекуррентной
формулой. В некоторых вариантах не следует выводить рекуррентную
формулу для n-го члена целиком. Постарайтесь разбить полное слож-
ное выражение на более простые части, для которых, или даже только
для некоторых из них, уже вывести соответствующие формулы (в случае
затруднения посоветуйтесь с преподавателем).
2. Воспользовавшись полученными рекуррентными соотношениями,
а также свойством (2), написать m-функцию, возвращающую значение
суммы s(x) данного ряда с произвольной сколь угодно малой погрешно-
стью ε > 0 (входной параметр) при произвольном значении аргумента
x из интервала [0, 1) (другой входной параметр). Допускается использо-
вать только 4 арифметических операции (сложение, вычитание, умноже-
ние и деление); операцию возведения в степень и другие встроенные ма-
тематические функции не использовать. При необходимости желатель-
но ввести дополнительные рекуррентные соотношения для минимизации
числа арифметических операций, выполняемых за каждый цикл.
3. Проверить правильность написанной программы с помощью кон-
трольной формулы (в каждом варианте приведена контрольная форму-
ла, которая, по крайней мере, для каждого 0 <= x < 1 определяет точ-
ное значение s(x)). Проверку можно осуществить непосредственно изкомандной строки.
4. Написать m-функцию, возвращающую значение n-ой частичной
суммы данного ряда sn(x) при произвольном значении аргумента x.
5. Воспользовавшись этой m-функцией как вспомогательной, напи-
сать новую m-функцию (основную), которая с помощью виртуально-
го графопостроителя (его заранее создать) строит графики sn(x) при
n = 1, 2, 4, 8 (это степени 2) для x ∈ [0, 1], а затем на том же интер-
вале — график s(x). Предельный график выделить цветом. Операцию
возведения в степень не использовать. Все графики строить по 10—20
равноотстоящим по оси OX точкам.
Решение
Выводим рекуррентное отношение.
Оформляем на языке МатЛаб.
Исходный код
function y=m2_a(x,n)
%ИСХ: x - аргумент, n – число членов
%РЕЗ: y – сумма членов последовательности
xn=(x+2)/2*x;
cn=x;
ch=2;
sp=xn;
while (ch<=n)
xn=(2*ch+x)/(fact(2*ch));
cn=-cn*x*x;
an=xn*cn;
sp=sp+an;
ch=ch+1;
end
y=sp;
function y=fact(x)
y=1;
if x>1
y=x*fact(x-1);
end
function sp=m2_b(x,e) % ИСХ.: х – число, е – погрешность.
% Рез: сумма чисел при данной погрешности
xn=(x+2)/2;
xn=xn*x;
cn=x;
an=Inf;
n=1;
sp=xn;
while (abs(an)>e)
n=n+1;
xn=(2*n+x)/fact(2*n);
cn=-cn*x*x;
an=xn*cn;
sp=sp+an;
end
%---Факториал
function y=fact(x)
y=1;
if x>1
y=x*fact(x-1);
end
function sx=sx(x) % s(х) - контрольная сумма
sx=sin(x)-cos(x)+1;
function m_e
p=Pero(0,0)
for n=1:8
p.set('lineColor', 'w')%установка в начало координат
p.punct(0,0)
p.draw
p.set('lineColor', 'g')
for x=0:0.1:1 %n=1,2,4,8
p.punct(x, dop(x,2))
p.draw
end
n=n*2;
end
for x=0:0.1:1 %график функции для m2
p.set('lineColor', 'w')
p.punct(0,0)
p.draw
p.set('lineColor', 'b')
p.punct(x, m2(x,0.001))
p.draw
end
Пример работы


Задание 3. Обработка одномерных массивов.
Цель работы
Научиться обрабатывать одномерные массивы
Задача
Написать m-функцию. Фигурирующий в каждом пункте заданий одномерный массив (вектор) x—это объект класса DOUBLE с веществен-
ными элементами. В каждом варианте задачу пункта 1 решить 3-мя
способами: с помощью цикла с условием и с помощью цикла с пара-
метром (цикл с параметром может иметь 2 варианта). Требуется:
1. y = x(2) ∗ x(4) ∗ x(6) ∗ . . . (произведение элементов с четными
индексами).
2. y = x(n1 + 1) + x(n1 + 2) + . . . + x(nk − 1), где n1, nk—индексы
1-го нулевого элемента, и, соответственно, последнего нулевого элемента
в массиве x (это если нулей в x больше 1 и nk > n1 + 1, а в против-
ном случае результат должен иметь значение 0).
3. Отсортировать по не убыванию все отрицательные элементы x, а
все остальные оставить на своих местах. [Указание: сформировать вспо-
могательный массив из всех отрицательных элементов исходного массива
и применить к нему сортировку.]
Решение:
Находим 1-ый нуль и последний. Затем суммируем элементы между этими нулями.
а) Выделяем отрицательные элементы в матрицу, где 1-ая строка – сами элементы, а 2-ая – их позиции.
б) Сортируем строки матрицы по возрастанию.
в) Делаем замену соответствующих элементов матрицы и массива.
Исходный код
1 способ
function p=m3a1(x) %1-ый вариант
%ИСХ.: x - массив
%РЕЗ.: p - произведение четных элементов
p=1;
i=2; % i - счетчик
while i<=length(x)
p=p*x(i);
i=i+2;
end
2 способ
function p=m3a2(x) %2-ой вариант
%ИСХ.: x - массив
%РЕЗ.: p - произведение четных элементов
p=1;
for i=2:2:length(x)
p=p*x(i);
end
3 способ
function p=m3a3(x) %3-ой вариант
%ИСХ.: x - массив
%РЕЗ.: p - произведение четных элементов
p=1;
for i=1:length(x)
if mod(i,2)==0
p=p*x(i);
end
end
function y=m3b(x)
%ИСХ.: x - массив
%РЕЗ.: p – сумма элементов, находящихся между нулями.
y=0;
for i=find_null_perv(x):find_null_posl(x)
y=y+x(i);
end
function t=find_null_perv(x)
%ИСХ.: x - массив
%РЕЗ.: t – индекс первого нуля
for i=1:length(x)
if x(i)==0 %t - 1-ый 0.
t=i;
break
end
end
function z=find_null_posl(x)
%ИСХ.: x - массив
%РЕЗ.: z – индекс последнего нуля
for i=1:length(x)
if x(i)==0 %t - последний 0.
z=i;
end
end
function y=m3(ma)
%ИСХ: ma - массив для сортировки отрицательных элементов
%РЕЗ: у - Все положительные элементы остались на месте, отрицательные
%отсортированы по неубыванию.
mo=[0;0];
for i=1:length(ma)
if ma(i)<0
mo(1,end+1)=[ma(i)]; %Все отрицательные элементы записываются в массив
mo(2,end)=[i];
end
end
mo(:,1)=[ ];
mo(1,:)=sortir(mo(1,:)); %Сортируются отдельно два столбца отрицательного массива mo(2,:)=sortir(mo(2,:));
for i=1:length(mo)
ma(mo(2, i))=mo(1,i); %Собственно замена всех отрицательных элементов
end
y=ma;
function ee=sortir(ma)
%Дано: ma - массив для сортировки элементов.
%Результат: ee – отсортированный массив.
d=length(ma);
for j=1:d-1
for i=1:d-j
if ma(i)>ma(i+1)
k=ma(i+1);
ma(i+1)=ma(i);
ma(i)=k;
end
end
end
ee=ma;
Пример работы
Способ 1

Способ 2

Способ 3



Задание 4. Обработка двумерных числовых массивов.
Цель работы
Научиться обрабатывать двумерные числовые массивы.
Задача
Написать m-функцию, выполняющую соответствующее задание. Фигурирующий в каждом пункте заданий двумерный массив (матрица) x—это объект класса DOUBLE с вещественными элементами. Требуется:
А. Подсчитать число столбцов, содержащих хотя бы один нулевой эле-
мент.
Б. Найти номер строки, в которой находится самая длинная серия
одинаковых элементов.
Решение
А)
Проверяем все столбцы матрицы на наличие в них 0.
Прибавляем к счетчику 1, если есть 0 в столбце.
Б)
Найти элемент, повторяющийся в строке наибольшее число раз.(подфункция)
Запомнить число его повторений
Создать одномерный массив, где значения элементов i-ых будет число
наиболших повторений, а номер элемента - номер строки
Найти наибольший значение элемента массива
Вывести номер столбца, где находится этот элемент
Исходный код.
А:
function y=m4a(x) %1-ый способ решения
% Считаем число столбцов в матрице, х - матрица.
y=0;
bool=0; %логическая переменная: наличие или отсутствие 0.
[m,n]=size(x); % m – число столбцов, n – число строк
for i=1:m
for j=1:n
if x(j,i)==0
bool=1;
end
end
if bool==1
y=y+1;
bool=0;
end
end
function y=m4b(x) % 2-ой способ решения
% Считаем число строк в транспонированной матрице, х - матрица.
% 1)Пройтись по всей матрице
% 2)Организовать счетчик
y=0;
xa=x.'; %Транспонируем матрицу
bool=0;
[m,n]=size(x); %m – число строк, n – число столбцов.
for j=1:m
for i=1:n
if xa(j,i)==0
bool=1;
end
end
if bool==1
y=y+1;
bool=0;
end
end
Б.
function y=poisk(x)
% ДАНО: х - матрица
% РЕЗУЛЬТАТ: у - номер строки, в которой самая длинна серия одинаковых
% элементов.
[m,n]=size(x);
mas(1:m)=0;
for i=1:m
ss=pod_func(x(i,:)); % Находим часто повторяющийся элемент в строке
mas(i)=ss; %Записываем его в массив
end
max=0;
for j=1:m
if mas(j)>max % Ищем, в какой строке чаще всего повторяется какой-либо элемент.
max=mas(j);
new=j;
end
end
y=new; % Выводим номер строки
function ss=pod_func(x)
% ДАНО: х - одномерный массив
% РЕЗУЛЬТАТ: ss - наибольшее число повторений числа в строке.
m=length(x); % Длина массива
l(1:m)=0;
for i=1:m %i,j - счетчики
for j=1:m
if x(i) == x(j)
l(i)=(l(i)+1); %Записываем число повторений соответствующего числа
end
end
end
max=0;
%Находим наибольшее число
for i=1:m
if max<l(i)
max=l(i);
end
end
ss=max;
Пример работы
А. 1 способ

2 способ

Б.

