Сгенерировать и сохранить в виде вектора 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
Написать цикл, вычисляющий среднее значение: а) всех элементов выборки 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
С помощью функции as.vector(table(cut(Rand, -40:40/10)))) получите абсолютные частоты Fr принадлежности значений переменной Rand различным поддиапазонам отрезка [-4,4]. Постройте гистограмму для заданных частот с помощью функции barplot().
fr=as.vector(table(cut(Rand, -40:40/10)))
barplot(fr)
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
Используя векторизованную операцию, преобразовать абсолютные частоты 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
Реализовать цикл, формирующий по элементам вектора 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")
Реализовать цикл, определяющий порядковый номер диапазона 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
Реализовать функцию, рассчитывающую скалярное произведение двух векторов равной длины. В случае векторов разной длины функция должна выдавать ошибку (для вывода ошибки используйте функцию 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
Реализовать функцию, решающую систему линейных алгебраических уравнений по заданной матрице коэффициентов 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