Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_2012 / ЧМ_Maxima_Excel / ЧМ_Excel_Maxima.pdf
Скачиваний:
198
Добавлен:
09.06.2015
Размер:
1.41 Mб
Скачать

Рис. 16. Метод простой итерации.

Решение определенных интегралов

Вычислить интеграл ò5 [(x 3)2 + 5]dx с заданным шагом h = 0.5 .

3

Формулы Ньютна – Котесса

Файл integrals.mac:

f(x):=-(x-3)^2+5;

eiler(a, b, e):=block(

[n:1, prev_sum:1.0, summa:0.0, h:0.0], print("<Method of eiler>:"),

while (abs(summa-prev_sum) > e) do( n : n*2,

prev_sum : summa, h : (b-a)/n,

summa : 0.0,

for i : 0 thru n-1 do(

summa : summa + 0.5*(f(a + i*h)+f(a+ (i+1)*h))*h+1.0/12*h*h*(at(diff(f(x),x),[x=a+i*h])-at(diff(f(x),x),[x=a+(i+1)*h]))

)

),

print("Number of splits: ", n), return (summa)

);

left(a, b, e) := block(

[n:1, prev_sum:1.0, summa:0.0, h:0.0], print("<Method of left-rectangles>:"), while abs(summa-prev_sum) > e do(

n : n*2,

prev_sum : summa, h : (b-a)/n,

summa : 0.0,

for i:0 thru n-1 do(

summa : summa + f(a + i*h)*h

)

),

print("Number of splits: ", n), return (summa)

);

central( a, b, e) := block(

[n:1, prev_sum:1.0, summa:0.0, h:0.0], print("<Method of central-rectangles>:"), while (abs(summa - prev_sum)/3 > e) do(

n : n*2,

prev_sum : summa, h : (b-a)/n,

summa : 0.0, for i:1 thru n do(

summa : summa + f(a + h*i-0.5*h)*h

)

),

print("Number of splits: ", n), return (summa)

);

right(a, b, e) := block(

[n:1, prev_sum:1.0, summa:0.0, h:0.0], print("<Method of right-rectangles>:"), while(abs(summa-prev_sum) > e) do(

n : n*2,

prev_sum : summa, h : (b-a)/n,

summa : 0.0,

for i:0 thru n-1 do(

summa : summa + f(b - i*h)*h

)

),

print("Number of splits: ", n), return (summa)

);

simpson(a, b, e) := block(

[n:1, prev_sum:1.0, summa:0.0, h:0.0], print("<Method of simpson>:"),

while (abs(summa-prev_sum)/7 > e) do( n : n*2,

prev_sum : summa,

h : (b-a)/n, summa : 0.0,

for i : a thru b-2.0*h step 2.0*h do(

summa : summa + f(i)+4.0*f(i+h)+f(i+2.0*h)

),

summa : summa*h/3.0

),

print("Number of splits: ", n ), return (summa)

);

trapezium(a, b, e) := block(

[n:1, prev_sum:1.0, summa:0.0, h:0.0], print("<Method of trapeziums>:"), while(abs(summa-prev_sum)/3 > e) do(

n : n*2,

prev_sum : summa, h : (b-a)/n,

summa : 0.0, for i:1 thru n do(

summa : summa + 0.5*h*(f(a+i*h) + f(a+(i-1)*h))

)

),

print("Number of splits: ", n), return (summa)

);

print("<Integral of function: -(x-3)^2+5>"); a:read("Enter lower limit: "); b:read("Enter upper limit: ");

if a >= b then block( print("Incorrect interval!!!"), break

);

e:read("Enter precision: "); if e <= 0.0 then block(

print("Incorrect precision!!!"), break

);

print();

print("Result: ", left(a, b, e)); print("Result: ", central(a, b, e)); print("Result: ", right(a, b, e)); print("Result: ", simpson(a, b, e)); print("Result: ", trapezium(a, b, e)); print("Result: ", eiler(a, b, e));

Рис.17. Результат методов левых, центральных, правых прямоугольников, Парабол, трапеций, Эйлера.

Метод Гаусса

Файл gauss.mac:

f(x) := -(x-3)^2+5; array(A1, 0); array(X1, 0); A1[0]:2.0; X1[0]:0.0;

array(A2, 1); array(X2, 1); A2[0] : 1; A2[1] : 1;

X2[0] : -0.577350269; X2[1] : 0.577350269;

array(A3, 2); array(X3, 2);

A3[0] : 0.5555556; A3[1] : 0.888888889; A3[2] : 0.5555556; X3[0] : -0.774596669; X3[1] : 0.0; X3[2] : 0.774596669;

array(A4, 3); array(X4, 3);

A4[0] : 0.347854845; A4[1] : 0.652145155; A4[2] : 0.652145155; A4[3] : 0.347854845; X4[0] : -0.861136312; X4[1] : -0.339981044; X4[2] : 0.339981044; X4[3] : 0.861136312;

array(A5, 4); array(X5, 4);

A5[0] : 0.236926885; A5[1] : 0.478628670; A5[2] : 0.568888889; A5[3] : 0.478628670; A5[4] : 0.236926885;

X5[0] : -0.906179846; X5[1] : -0.538469319; X5[2] : 0.0; X5[3] : 0.538469319; X5[4] : 0.906179846;

array(A6, 5); array(X6, 5);

A6[0] : 0.171324492; A6[1] : 0.360761573; A6[2] : 0.467913934; A6[3] : 0.467913934; A6[4] : 0.360761573; A6[5] : 0.171324492;

X6[0] : -0.932469514; X6[1] : -0.661209386; X6[2] : -0.238619186; X6[3] : 0.238619186; X6[4] : 0.661209386; X6[5] : 0.932469514;

array(A7, 6); array(X7, 6);

A7[0] : 0.129484966; A7[1] : 0.279705391; A7[2] : 0.381830051; A7[3] : 0.417959184; A7[4] : 0.381830051; A7[5] : 0.279705391; A7[6] : 0.129484966;

X7[0] : -0.949107912; X7[1] : -0.741531185; X7[2] : -0.405845151; X7[3] : 0.0; X7[4] : 0.405845151; X7[5] : 0.741531185; X7[6] : 0.741531185;

print("<Integral of function: -(x-3)^2+5>"); a : read("Enter lower limit: ");

b : read("Enter upper limit: "); if a >= b then block(

print("Incorrect interval!!!"), break

);

n : read("Enter n[1...7]: ");

if n > 7 and n < 1 then block( print("Incorrect n!!!"), break

);

ans : 0.0;

if n = 1 then ans : A1[0]*f((b+a)/2.0+(b-a)/2.0*X1[0]); if n = 2 then

for i : 0 thru 1 do(

ans : ans+A2[i]*f((b+a)/2.0+(b-a)/2.0*X2[i])

);

if n = 3 then

for i : 0 thru 2 do(

ans : ans+A3[i]*f((b+a)/2.0+(b-a)/2.0*X3[i])

);

if n = 4 then

for i : 0 thru 3 do(

ans : ans+A4[i]*f((b+a)/2.0+(b-a)/2.0*X4[i])

);

if n = 5 then

for i : 0 thru 4 do(

ans : ans+A5[i]*f((b+a)/2.0+(b-a)/2.0*X5[i])

);

if n = 6 then

for i : 0 thru 5 do(

ans : ans+A6[i]*f((b+a)/2.0+(b-a)/2.0*X6[i])

);

if n = 7 then

for i : 0 thru 6 do(

ans : ans+A7[i]*f((b+a)/2.0+(b-a)/2.0*X7[i])

); ans : ans/2*(b-a);

print("<Method of gauss>:::", ans);