Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет по ЯП(1 сем).docx
Скачиваний:
32
Добавлен:
10.05.2015
Размер:
297.9 Кб
Скачать

Введение

Для решения задач из типового расчета и написания программ используется язык программирования Matlab. Это пакет прикладных программ для решения задач технических вычислений и одноимённый язык программирования, используемый в этом пакете. Maltab хорошо подходит для начального ознакомления с основами программирования, т.к. был разработан для решения математических задач.

1 Основная часть

    1. Задание 1. Программирование формул и управление виртуальным графопостроителем.

      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.

      1. Решение

  1. x, n – входные данные.

  2. Находим значение выражения под знаком суммы.

  3. Домножаем значение суммы на выражение за знаком суммы.

      1. Исходный код

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') % возвращаем нужный цвет

      1. Пример работы

а)

б)

    1. Задание 2. Использование рекуррентных соотношений для суммирования степенных рядов.

      1. Цель работы

Научиться использовать рекуррентные соотношения.

      1. Задача

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 точкам.

      1. Решение

  1. Выводим рекуррентное отношение.

  2. Оформляем на языке МатЛаб.

      1. Исходный код

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

      1. Пример работы

    1. Задание 3. Обработка одномерных массивов.

      1. Цель работы

Научиться обрабатывать одномерные массивы

      1. Задача

Написать 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-ый нуль и последний. Затем суммируем элементы между этими нулями.

а) Выделяем отрицательные элементы в матрицу, где 1-ая строка – сами элементы, а 2-ая – их позиции.

б) Сортируем строки матрицы по возрастанию.

в) Делаем замену соответствующих элементов матрицы и массива.

Исходный код

  1. 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. Пример работы

  1. Способ 1

Способ 2

Способ 3

    1. Задание 4. Обработка двумерных числовых массивов.

      1. Цель работы

Научиться обрабатывать двумерные числовые массивы.

      1. Задача

Написать m-функцию, выполняющую соответствующее задание. Фигурирующий в каждом пункте заданий двумерный массив (матрица) x—это объект класса DOUBLE с вещественными элементами. Требуется:

А. Подсчитать число столбцов, содержащих хотя бы один нулевой эле-

мент.

Б. Найти номер строки, в которой находится самая длинная серия

одинаковых элементов.

      1. Решение

А)

  1. Проверяем все столбцы матрицы на наличие в них 0.

  2. Прибавляем к счетчику 1, если есть 0 в столбце.

Б)

  1. Найти элемент, повторяющийся в строке наибольшее число раз.(подфункция)

  2. Запомнить число его повторений

  3. Создать одномерный массив, где значения элементов i-ых будет число

наиболших повторений, а номер элемента - номер строки

  1. Найти наибольший значение элемента массива

  2. Вывести номер столбца, где находится этот элемент

      1. Исходный код.

А:

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. Пример работы

А. 1 способ

2 способ

Б.