Упражнение 4.

Списъци

Повечето вградени функции в Mathematica могат да се прилагат върху списъци

{1,2,3,4,5}^2
Sqrt[{{ {2,3}, {4,5}}, {{6,7}, {8,9}}}]
1/{1,2,3,4,5}
{1,2,3}+{4,5,6}
{1,2,3}{4,5,6} (* Умножава списъците поелементно *)
{1,2,3}.{4,5,6} (*Скаларно произведение *)
2^{0,1,2,3,4,5,6,7,8,9,10}
Cos[{0,Pi/4, Pi/2, 3Pi/4, Pi}]

Операции върху списъци

alist={2,x,y,{a,b}};

Length [alist] (* Връща дължината на списъка alist *)
alist [[3]] (* Връща третия елемент от списъка *)
alist[[1]] (*Обърнете внимание, че индексирането започва от 1, а не от 0 !!!*)
alist[[4]][[2]] (* Еквивалентен по-кратък запис е alist[[4,2]] *)
alist[[{1,3}]] (*Връща първия и третия елемент на списъка*)
alist[[1;;3]] (*Връща всички елементи от първия до третия*)

Създаване на списъци (Range, Table)

Range[10](* Range[N] връща списък с числата от 1 до N *)
Range[4.5, 15.1](* Range[A,B] връща списък с числата от A до B (включително) със стъпка 1 *)
Range [0,1,1/10](* Range[A, B, step] връща списък с числата от A до B (включително) през стъпка step *)

Table[формула, итератор] връща списък, общият член на който е зададен с “формула”, а “итератор” задава значенията на променливата, използвана във “формула”.

Table [k^2, {k,10}] (* Стойностите на k са първите 10 естествени числа *)
Table [k^2, {k,2,5}] (* Стойностите на k са числата от 2 до 5 (през 1) *)
Table [Cos[x], {x,1,10,1/2}] (* Стойностите на x са числата от 1 до 10 през 1/2 *)

Задача 1: Като използвате Table и Prime, създайте списък с първите 100 прости числа. Генерирайте същия списък, използвайки само Prime и Range.

Table[Prime[x], {x, 100}]
Prime[Range[100]] (*Както повечето вградени функции, Prime може да се приложи върху списъка, съдържащ първите 100 естествени числа*)

Задача 2: Генерирайте списък със стойности на функцията f(x)=((sin x)/x) за x = 0.1, 0.2, ..., 1 използвайки Table и Range.

f[x_]=Sin[x]/x;
Table[f[x], {x, 0.1, 1, 0.1}]
f[Range[0.1,1,0.1]]

Задача 3: Генерирайте списък с първите 50 нечетни числа, като използвате Table, а след това и Range.

Table[2k+1, {k, 0,49}]
f[x_]=2x+1;
f[Range[0,49]]

Задача 4: Използвайте Table, за да генерирате списък от наредени двойки {x, f(x)} за x = 0, (ℼ/12), ((2ℼ)/12), ..., ℼ, където f(x)=sin x.

Table[{x, Sin[x]}, {x, 0, Pi, Pi/12}]

Процедурно програмиране в Mathematica

If [condition, true, false]

abs[x_]:= If[x<0, -x, x] (* Функцията "модул x" *)
x = 5;
If[x<0, y=-x, y=x]
If[x≠5, Print[x], Print[2x];Print[4x]] (*Аргументите на If се разделят със запетая, а ако в един аргумент имаме повече от един оператор, операторите се 
разделят с точка и запетая*)

Оператор за цикъл Do [body, iterator]

x=Range[0,10];
Do [Print[x[[k]]], {k, 1, Length[x]}]

Да се дефинира функция, която итеративно намира n! по зададено n.

fact[n_]:= 
(       (*Тялото на функцията се загражда с кръгли скоби, ако включва повече от един оператор*)
	res = 1;
	Do[res*=k, {k, 1, n}];
	res
)

Рекурсивно решение

factRecursive[n_]:=If[n==1 || n==0, 1, n*factRecursive[n-1]]

Задача 6: Да се дефинира функция max[list_, a_, b_], която по зададен списък list и числа a, b намира най-голямото число от списъка, което е в интервала [a, b].

maxAB[list_, a_, b_]:=
(
	max=a-1;
	Do[
		If[list[[k]]>max && a≤list[[k]]≤b, max=list[[k]]],
		{k, 1,Length[list]}
	];
	If[max≥a, max, "No such number"]
)

maxAB [{3,5,2,4,6,12,4,2,4,6}, 2,7]

maxAB[{3,5,2,4,6,12,4,2,4,6}, 0, 1]

Задача 7 (за тези, които са свършили по-бързо със задача 6): Да се дефинира функция, която намира φ(x), където φ(x) е функцията на Ойлер - връща броя на числата ≤ x, които са взаимно прости с x.

phi[x_]:=
(
	res=0; (*Инициализираме брояч, който да пази броя на търсените числа*)
	Do[ 
		If[GCD[k,x]==1, res++], (*ако НОД(k, x) == 1, броячът се увеличава с 1*) 
		{k, 1, x} (*Обхождането става по всички числа от 1 до x, където k е итерационната променлива*)
	];
	res
)

Задача 8: Да се дефинира функция LagrangeBasis[k_, list_, x_], която връща k-тия базисен полином на Лагранж (Subscript[l, k])(x).

LagrangeBasis[k_,nodes_,x_]:=
(
	res=1;
	Do[
		If[i≠k, res*=((x-nodes[[i+1]])/(nodes[[k+1]]-nodes[[i+1]])) ],
		{i,0,Length[nodes]-1}
	];
	Simplify[res]
)

LagrangeBasis[0,{0,1,2},2]

Задача 9: Да се дефинира функция LagrangePolynomial[nodes_,values_, x_],  която намира полинома на Лагранж с възли nodes и стойности values.

LagrangePolynomial[nodes_,values_,x_]:=
(
	poly=0;
	Do[
		poly+=values[[k]]*LagrangeBasis[k-1,nodes,x],
		{k,1,Length[nodes]}
	];
	Simplify[poly]
)

LagrangePolynomial[{0,0.5,1,1.5},{1,2,3,4},x]