Homework №1

Задание 1

Сгенерировать и сохранить в виде вектора Rand выборку размера n значений случайной величины, распределённой по стандартному нормальному закону.

n=10000
rand=rnorm(n)

Задание 2

Написать цикл, вычисляющий среднее значение: а) всех элементов выборки Rand

sum=0

for (i in 1:n) {
  sum = sum + rand[i]
  if (i == n) {m = sum/n}
} 

print(m)    
## [1] 0.007950066

б) только положительных элементов выборки Rand

sum2=0
p=0
for (i in 1:n) { 
  if(rand[i]>0){
    sum2 = sum2 + rand[i]
    p= p + 1
  } 
  if (i == n ) {m = sum2/p}
} 

print(m)    
## [1] 0.8050322

Проверяю правильность работы цикла

mean(rand[rand>0])  
## [1] 0.8050322

Задание 3

С помощью функции as.vector(table(cut(Rand, -40:40/10)))) получите абсолютные частоты Fr принадлежности значений переменной Rand различным поддиапазонам отрезка [-4,4]. Постройте гистограмму для заданных частот с помощью функции barplot().

fr=as.vector(table(cut(rand, -40:40/10)))
barplot(fr)

Задание 4

Используя векторизованную операцию, преобразовать абсолютные частоты Fr в относительные Pr, поделив Fr на размер выборки n.

pr=fr/n

Задание 5

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

sum_pr=seq(1,length(pr),by=1)
sum_pr[1]=pr[1];

for(i in 2:length(pr)) {
  sum_pr[i]=sum_pr[i-1]+pr[i];
}
plot(sum_pr, type="l")

Задание 6

Реализовать цикл, определяющий порядковый номер диапазона k, на котором достигается заданное значение кумулятивной суммы 0 <= max <= 1.

k=1
max=0.5
for (k in 1:(length(sum_pr))) {
  if (sum_pr[k]>max) break
}
sum_pr[k]
## [1] 0.5375
k
## [1] 41

Задание 7

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

vector_sum<-function(a,b)
{
  sum=0;
  for (i in 1:length(a)) {
    if (length(a)==length(b)) {
      sum=sum+a[i]*b[i]
    } else {
      stop("Вектора имеют разную длину") 
    }
  }
  print(sum)
}
a=1:5; 
b=1:5;
vector_sum(a,b)
## [1] 55

Homework №2

Реализовать функцию Kramer(A, b), решающую систему линейных алгебраических уравнений по заданной матрице коэффициентов A и свободному вектору b (правая часть системы) методом Крамера. Сравнить решения системы уравнений, полученные с помощью созданной функции Kramer и с помощью встроенной в R функции solve.

a=matrix(c(506,66,66,11),ncol=2,byrow=T)
b=c(2315.1,392.3)
kramer<-function(a,b)
{ m=length(a[1,])
  x=vector(length=m)
  c=matrix(ncol=m,nrow=m)
  detA=det(a)
  if(detA==0) {stop("Метод Крамера не поможет, нужно использовать метод Гаусса"); break;}
  for (i in seq(1:m))
  {
    for(j in seq(1:m))
    {   if (i==j) {
        c[,j]=b
      } else {
        c[,j]=a[,j]
      }
    }
    x[i]=det(c)/detA
  }
  print(x)
}
kramer(a,b)
## [1] -0.3518182 37.7745455

Используем встроенную функцию solve.

solve(a,b)
## [1] -0.3518182 37.7745455