Задание 1

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

Rand=rnorm(100, mean=0, sd=1)
Rand
##   [1] -0.46812  0.17300 -0.63831  1.30066  0.63948 -1.24510 -1.76693
##   [8] -0.64790  1.23922 -0.84693 -1.00164 -0.84320 -0.36285  0.74052
##  [15]  2.21695  1.12521 -0.34252  0.23261 -1.68257  0.42919  0.59322
##  [22]  0.20620  0.50271 -1.34862  0.68581 -0.85673 -1.68557 -0.28215
##  [29] -0.50327 -1.56278  1.15413  1.23514  0.90776 -0.13689  1.61920
##  [36] -0.81507  1.45247  0.25120 -0.18486  0.95779  0.08192 -0.34409
##  [43]  0.22481  1.70135 -0.69332  1.33545 -0.42564  0.11175  0.51082
##  [50]  0.23997  1.04298 -0.25419 -1.90517 -0.19286  1.13631 -0.28887
##  [57]  0.82314  1.31558 -0.27771  0.17517  0.28266  1.40783 -1.04507
##  [64] -0.51982  1.14893  1.06214 -1.43446 -0.48695  0.50742  0.92662
##  [71] -0.72609  0.71206  0.48119  1.16355 -1.02987 -1.64717 -0.17225
##  [78]  0.75005 -1.60826 -1.20032 -0.31814  0.27598  0.76587 -0.84611
##  [85]  1.01192 -0.55508 -0.58725 -0.83396 -0.23143 -0.54998  0.09285
##  [92] -0.33860  0.93765 -1.29187  1.90911 -1.37133 -0.65681  0.10985
##  [99] -0.12290  0.38449

Задание 2

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

f<-function(a, n=length(a), positive=F)
{
  res=0; qp=n; #qp==quantity_of_positive
  if (!positive) {
    for (i in 1:n) res=res+a[i];
    res=res/n;
  }
  else {
    for (i in 1:n) {
      if (a[i]>0) res=res+a[i]
      else qp=qp-1;
    }
    if (qp!=0) res=res/qp else print("No positives. Sorry(");
  }
  res;
}
f(Rand)
## [1] 0.01114
f(Rand,T)
## [1] -0.4681

Задание 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)

plot of chunk unnamed-chunk-3

fr
##  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 4 1 1 2 3 0 3 0 6 1 4 5
## [36] 3 5 5 5 0 2 4 7 1 2 4 2 4 1 4 3 5 2 3 2 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0
## [71] 0 0 0 0 0 0 0 0 0 0

Задание 4

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

pr=fr/100
pr
##  [1] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## [15] 0.00 0.00 0.00 0.00 0.00 0.00 0.01 0.00 0.01 0.04 0.01 0.01 0.02 0.03
## [29] 0.00 0.03 0.00 0.06 0.01 0.04 0.05 0.03 0.05 0.05 0.05 0.00 0.02 0.04
## [43] 0.07 0.01 0.02 0.04 0.02 0.04 0.01 0.04 0.03 0.05 0.02 0.03 0.02 0.00
## [57] 0.01 0.01 0.00 0.01 0.00 0.00 0.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00
## [71] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Задание 5

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

a=seq(1,length(pr),by=1)
a[1]=pr[1];
for(i in 2:length(pr)) {
  a[i]=a[i-1]+pr[i];
}
plot(a, type="l")
plot of chunk unnamed-chunk-5

Задание 6

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

k=1
max=0.6
for (k in 1:(length(a)-1)) {
  if (a[k+1]>max) break
}
a[k]; k
## [1] 0.56
## [1] 42

Задание 7

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

smul<-function(a,b)
{
  sum=0;
  for (i in 1:length(a)) {
    if (length(a)!=length(b)) stop("differrent length of vectors");
    sum=sum+a[i]*b[i];
  }
  print(sum)
}
a=2:5; b=2:5;
smul(a,b)
## [1] 54

ДЗ №2

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

a=matrix(c(1,3,2,4,3,5,4,6,5),ncol=3,byrow=T)
b=c(6,15,24)
kramer<-function(a,b)
{
  if (!is.matrix(a)) stop("The matrix a is not valid.");
  dims=length(a[1,]);
  x=vector(length=dims);
  xi=vector(length=dims);
  d=det(a); c=matrix(ncol=dims,nrow=dims);
  for (i in seq(1:dims))
  {
    for(j in seq(1:dims))
    {
      if (i==j) c[,j]=b
      else c[,j]=a[,j];
    }
    x[i]=det(c)/d;
  }
  print(x);
}
kramer(a,b)
## [1]  9  3 -6

Или можем получить результат используя функцию solve():

solve(a,b)
## [1]  9  3 -6