1.5 Задание 5. Векторные и матричные вычисления.
1.5.1 Цель работы
Научиться работать с векторами и матрицами.
1.5.2 Задача
В этом задании требуется повторно выполнить некоторые пункты из предыдущих заданий, применяя теперь встроенные векторно-матричные операции и функции:
1. Запрограммировать в виде m-функции вычисление выражения из
ЗАДАНИЯ1 при произвольных значениях величин x, n (входные пара-
метры), где x—это вектор произвольной длины, n—скаляр. Результат
вычисления должен быть массивом, соразмерным с x. Рассмотреть 2 ва-
рианта: с одним циклом и вообще без единого цикла.
2. Написать m-функцию, строящую график этого выражения на ин-
тервале [a, b], по k равноотстоящим точкам, для чего воспользоваться
встроенной функцией LINE.
3. Написать m-функцию, возвращающую вектор значений k-го чле-
на степенного ряда из ЗАДАНИЯ2, соответствующий вектору значений
аргумента x.
4. Запрограммировать (в цикле) вычисление частичных сумм sn(x) в
случае векторного аргумента x и одновременное построение их графиков
с помощью функции LINE при n = 2, 4, 8, 16. [Указание: если графики
слишком плотно проходят друг к другу, то можно увеличить диапазон
значений аргумента, чтобы убедиться в том, что расхождения графиков
все же имеют место.]
5. Выполнить заново ЗАДАНИЕ3 (все три пункта. Обойтись без цик-
лов).
6. Выполнить заново ЗАДАНИЕ4 (в 1-ом пункте обойтись без циклов,
а во втором, возможно, совсем обойтись без циклов не удастся).
1.5.3 Решение
1. Используя встроенную команду repmat, создаем матрицу и решаем при помощи матрицы задание.
2. Меняем графопостроитель из 1-ого задания на Line.
3. Добавляем индексацию в задание 2.
4. Доработать 2-ое задание, меняем графопостроитель.
5. Считаем число столбцов в матрице, х - матрица.
1)Пройтись по всей матрице
2)Организовать счетчик
1.5.4 Исходный код
1. function y=m1a(x,n)
y(1:length(x))=0; %В нем хранятся суммы
for i=1:length(x)
s=summa(x(i),n);
y(i)=0.05*sqrt(n+abs(x(i)))*s;
end
end
function s=summa(x,n)
s=0;%В s хранится промежуточная сумма i-ого члена последовательности
for i=1:n
s=s+(exp(n+sqrt(x))*cos(2*x/n))^(1/n);
end
end
function y=m1b(x,n)%ИСХ: х – вектор, п – число слогаемых. РЕЗ: у – вектор.
t=length(x);
k=1:n;
k=repmat(k,t,1);
k=k.';
x=repmat(x,n,1);
l=(exp(k+sqrt(x)).*cos(2*x./n)).^(1./n);
y=l.*sqrt(n+abs(x));
y=y.*0.05;
2. function m2
a=input('Введи левая граница a=');% Левая граница
b=input('Введи правая граница b=');% Правая граница
n=input('Введи число слогаемых n=');% Число слогаемых
ch=input('Введи число точек графика ch=');%Число точек графика
h=(b-a)/(ch-1); %h - шаг
k=1;
z=[];
%строит график
for i=a:h:b
z=m1(i,n);
x(k)=i;
k=k+1;
end
line(x, z)
3. function y=m3(x,n) % Вычисляет по формуле значения из вектора х.
for i=1:length(x)
xn=(x+2)/2*x(i);
cn=x(i);
ch=2;
sp=xn;
while (ch<=n)
xn=(2*ch+x(i))/(fact(2*ch));
cn=-cn*x(i)*x(i);
an=xn*cn;
sp(i)=sp(i)+an;
ch=ch+1;
end
y(i)=sp(i);
end
4. function m4(x)
for n=1:16
line(x, dop(x,n))
n=n*2;
end
function y=dop(x,n) % Сумма n членов при x
% y = СУММА(a1+a2+...+an)
for i=1:length(x)
xn=(x+2)/2*x(i);
cn=x(i);
ch=2;
sp=xn;
while (ch<=n)
xn=(2*ch+x(i))/(fact(2*ch));
cn=-cn*x(i)*x(i);
an=xn*cn;
sp(i)=sp(i)+an;
ch=ch+1;
end
y(i)=sp(i);
end
5. function p=m3_a(x)
i=length(x);
l=x(2:2:i);
p=prod(l);
function y=m3_b(x)
% Создать массив, который расположен между "0", и суммировать
% элементы.
promeG=find(x==0);
new=x(promeG(1):promeG(end));
y=sum(new);
function y=m3_c(ma)
%Дано: ma - массив для сорторовки отрицательных элементов
%Результат: Все положительные элементы остались на месте, отрицательные
%отсорторованны по неубыванию.
mo=find(ma<0);
mo(2,:)=ma(mo);
mo=sort(mo,2);
ma(mo(1,1:length(mo)))=mo(2,1:length(mo)); %Собственно замена всех отрицательных элементов
y=ma;
6. function y=m4a(x)
% ИСХ: х – матрица, РЕЗ: у – число столбцов.
[m,n]=find(x==0);
m=unique(n);%Убирает повторяющиеся элементы
y=length(m);
function y=m4b(x) %ИСХ: х –матрица. РЕЗ: у – номер строки
[m,n]=size(x);
mas(1:m)=0;
for i=1:m
mas(i)=pod_func(x(i,:));
end
y=find(mas==max(mas));
function ss=pod_func(x)
m=length(x);
l(1:m)=0;
for i=1:m
z=find(x==x(i));
l(i)=length(z);
end
ss=max(l); %Находим наибольшее число
1.5.5 Пример работы
2.
3.