2. Практическая часть
2.1 Решить дифференциальное уравнение
,
y (0)=1 на отрезке [0;1] (с шагом h =0,1) методом Эйлера .
Формула:
\tilde y_i=y_{i-1}+(x_i-x_{i-1})f(x_{i-1},y_{i-1}) .
Найдем значения y при х = 0.1, 0.2, ...1 с шагом h = 0,1; округляю до 0,001; f - значение функции 2* ( x 2 + y ) при соответсвующих значениях x и y :
y (0,1) = y (0) + h*f (0;1) = 1 + 0,1*(2*1) = 1,2
y (0,2) = y (0,1) + h*f (0,1; 1,2) = 1,2 + 0,1*(2*1,21) = 1,442
y (0,3) = y (0,2) + h*f (0,2; 1,442) = 1,442 + 0,1*(2*1,482) ≈ 1,738
y (0,4) = y (0,3) + h*f (0,3; 1,738) = 1,738 + 0,1*(2*1,828) ≈ 2,104
y (0,5) = y (0,4) + h*f (0,4; 2,104) = 2,104 + 0,1*(2*2,264) ≈ 2,557
y (0,6) = y (0,5) + h*f (0,5; 2,557) = 2,557 + 0,1*(2*2,807) ≈ 3,118
y (0,7) = y (0,6) + h*f (0,6; 3,118) = 3,118 + 0,1*(2*3,478) ≈ 3,814
y (0,8) = y (0,7) + h*f (0,7; 3,814) = 3,814 + 0,1*(2*4,304) ≈ 4,675
y (0,9) = y (0,8) + h*f (0,8; 4,675) = 4,675 + 0,1*(2*5,315) ≈ 5,738
y (1) = y (0,9) + h*f (0.9; 5.738) = 5,738 + 0,1*(2*6,548) ≈ 7,048
2.2 Найти интерполяционный или аппроксимирующий полином второй степени с помощью формулы Лагранжа .
f(x) \approx P_n(x) = \sum_{k=0}^n y_k \frac {(x-x_0)(x-x_1) \ldots (x-x_{k-1})(x-x_{k+1}) \ldots (x-x_n)} {(x_k-x_0)(x_k-x_1) \ldots (x_k-x_{k-1})(x_k-x_{k+1}) \ldots (x_k-x_n)},
Таблица 1 — Формула Лагранжа.
i |
Xi |
Yi |
Li |
0 |
0 |
1 |
2*x2-3*x+1 |
1 |
0,5 |
2,56 |
10,228*x-10,228*x2 |
2 |
1 |
7,05 |
14,096*x2-7,048*x |
3 |
|
|
7,05 |
L 0 (x i0 ) = Y i0 *(( ( x – x 1 )*(x-x 2 ))/((x 0 – x 1 )*(x 0 – x 2 ))) =
=1*(((x – 0,5)*(x-1))/((0-0,5)*(0-1))) = 2*x 2 – 3*x +1
L 1 (x i1 ) = Y i1 *(((x-x 0 )*(x-x 2 ))/((x 1 -x 0 )*(x 1 -x 2 )))=
=2,557*(((x-0,5)*(x-1))/((0,5-0)(0,5-1)))= 10,228*x – 10,228*x 2
L 2 (x i2 ) = Y i2 *(((x-x 0 )*(x-x 1 ))/((x 2 -x 0 )*(x 2 -x 1 ))) =
= 7,048*(((x-0)*(x-0,5))/((1-0)*(1-0,5))) = 14,096*x 2 – 7,048*x
L 3 =L 0 +L 1 +L 2 = 2*x 2 – 3*x +1 + 10,228*x–10,228*x 2 +14,096*x2-7,048*x =
= 5,868*x 2 +0,18*x+1
Подставим в L 3 значение х = 1. Получим:
L 3 = 5,868*1 2 +0,18*1 + 1 = 7,048
Т.е. мы рассчитали правильно методом Эйлера, проверив его формулой Лагранжа.
2.3Провести оптимизацию полученного полинома на отрезке [0;1] по методу дихотомии.
Зададим для простоты вычисления точность E = 0,1:
а) Нахождение отрезка, где присутсвует минимум функции -
Дан отрезок АВ. Минимум будет лежать на том отрезке, где будет выполняться неравенство (A+B)/2 < E .
Шаг 1 . Пусть А = 0, В = 1, t – погрешность. И зададим значение t = 0,25.
x 1 = ((A+B)/2) -t = 0,5 – 0,25 = 0,25
x 2 = ((A+B)/2)+t = 0,5+0,25 = 0,75
Подставим в формулу Лагранжа значение х 1 и х 2 :
L 3 (x 1 ) = 5,868*x 2 +0,18*x+1 = 5,868*0,25 2 +0,18*0,25+1 ≈ 1,417
L 3 (x 2 ) = 5,868*x 2 +0,18*x+1= 5,868*0,75 2 +0,18*0,75+1 ≈ 3,571
Шаг 2. Уменьшаем длину отрезка и погрешность в 2 раза, т.е. А = 0; В = 0,5;
t = 0,125.
x 1 = ((A+B)/2) -t = 0,25 – 0,125 = 0,125
x 2 = ((A+B)/2)+t = 0,25+0,125 = 0,375
L 3 (x 1 ) = 5,868*x 2 +0,18*x+1 = 5,868*0,125 2 +0,18*0,125+1 ≈ 1,114
L 3 (x 2 ) = 5,868*x 2 +0,18*x+1= 5,868* 0,375 2 +0,18* 0,375 +1 ≈ 1, 893
Шаг 3. Уменьшаем длину отрезка и погрешность в 2 раза, т.е. А = 0; В = 0,25;
t = 0,0625.
x 1 = ((A+B)/2) -t = 0,125 – 0,0625 = 0,0625
x 2 = ((A+B)/2)+t = 0,125+0,0625 = 0,1875
L 3 (x 1 ) = 5,868*x 2 +0,18*x+1 = 5,868* 0,0625 2 +0,18*0, 0625 +1 ≈ 1,034
L 3 (x 2 ) = 5,868*x 2 +0,18*x+1= 5,868*0,1875 2 +0,18*0,1875+1 ≈ 1,24
Шаг 4. Уменьшаем длину отрезка и погрешность в 2 раза, т.е. А = 0, В = 0,125, t = 0,03125.
x 1 = ((A+B)/2) -t = 0,0625 – 0,03125 = 0,03125
x 2 = ((A+B)/2)+t = 0,0625+0,03125 = 0,09375
L 3 (x 1 ) = 5,868*x 2 +0,18*x+1 = 5,868*0,03125 2 +0,18*0,03125+1 ≈ 1,0 11
L 3 (x 2 ) = 5,868*x 2 +0,18*x+1= 5,868* 0,09375 2 +0,18* 0,09375 +1 ≈ 1, 068
Шаг 5. Уменьшаем длину отрезка и погрешность в 2 раза, т.е. А = 0, В = 0,0625; t = 0,015625 .
Т.к. (А+В)/2 < E, то минимум пренадлежит интервалу от (0; 0,0625)
б) Нахождение отрезка, где присутсвует максимум функции
Зададим для простоты вычисления точность E = 0,1:
Дан отрезок АВ. Минимум будет лежать на том отрезке, где будет выполняться неравенство (A+B)/2 < E .
Шаг 1 . Пусть А = 0, В = 1, t – погрешность. И зададим значение t = 0,25.
x 1 = ((A+B)/2) -t = 0,5 – 0,25 = 0,25
x 2 = ((A+B)/2)+t = 0,5+0,25 = 0,75
Подставим в формулу Лагранжа значение х 1 и х 2 :
L 3 (x 1 ) = 5,868*x 2 +0,18*x+1 = 5,868*0,25 2 +0,18*0,25+1 ≈ 1,417
L 3 (x 2 ) = 5,868*x 2 +0,18*x+1= 5,868*0,75 2 +0,18*0,75+1 ≈ 3,571
Шаг 2. Уменьшаем длину отрезка и погрешность в 2 раза, т.е. А = 0, 5 ; В = 1;
t = 0,125.
x 1 = ((A+B)/2) -t = 0,75 – 0,125 = 0,625
x 2 = ((A+B)/2)+t = 0,75+0,125 = 0,375
L 3 (x 1 ) = 5,868*x 2 +0,18*x+1 = 5,868* 0,625 2 +0,18* 0,625 +1 ≈ 3, 405
L 3 (x 2 ) = 5,868*x 2 +0,18*x+1= 5,868* 0,75 2 +0,18* 0,75 +1 ≈ 5, 65
Шаг 3. Уменьшаем длину отрезка и погрешность в 2 раза, т.е. А = 0,75 ; В = 1 ;
t = 0,0625.
x 1 = ((A+B)/2) -t = 0,875 – 0,0625 = 0,8125
x 2 = ((A+B)/2)+t = 0,875 +0,0625 = 0,9 375
L 3 (x 1 ) = 5,868*x 2 +0,18*x+1 = 5,868* 0,8125 2 +0,18*0, 8125 +1 ≈ 5,02
L 3 (x 2 ) = 5,868*x 2 +0,18*x+1= 5,868* 0,9375 2 +0,18*0,9 375 +1 ≈ 6, 326
Шаг 4. Уменьшаем длину отрезка и погрешность в 2 раза, т.е. А = 0,875; В = 1, t = 0,03125.
x 1 = ((A+B)/2) -t = 0,9 375 – 0,03125 = 0,90625
x 2 = ((A+B)/2)+t = 0,9 375 +0,03125 = 0,96875
L 3 (x 1 ) = 5,868*x 2 +0,18*x+1 = 5,868* 0,90625 2 +0,18* 0,90625 +1 ≈ 5,982
L 3 (x 2 ) = 5,868*x 2 +0,18*x+1= 5,868* 0, 96875 2 +0,18* 0,9 6875+1 ≈ 6,681
Шаг 5. Уменьшаем длину отрезка и погрешность в 2 раза, т.е. А = 0,9375; В= 1 ; t = 0,015625 .
Т.к. (А+В)/2 < E, то максимум пренадлежит интервалу от (0,9375; 1)
2.4 Найти значение определенного интеграла полинома на указанном отрезке методом С импсона .
{\int\limits_a^b f(x) dx} \approx {\int\limits_{a}^{b} {p_2(x)} dx} = \frac{b-a}{6}{ \left( f(a) + 4 f\left(\frac{a+b}{2}\right) + f(b) \right)},
Для простоты вычисления разделим отрезков {0; 1 } на 5 равных отрезков:
{ 0; 0,2}
{0,2; 0,4}
{0,4; 0,6}
{0,6; 0;8}
{0,8; 1}
Середину каждого отрезка подставим в полученную формулу Лагранжа вместо х:
L 3 = 5,868*x 2 +0,18*x+1
а) L 3 1 = 5,868*(0,1) 2 +0,18*0,1+1
б) L 3 2 = 5,868* (0,3) 2 +0,18* 0,3 +1
в) L 3 3 = 5,868* (0,5) 2 +0,18* 0,5 +1
г) L 3 4 = 5,868* (0,7) 2 +0,18* 0,7 +1
д) L 3 5 = 5,868* (0,9) 2 +0,18* 0,9 +1
S об = 0,2*( L 3 1 + L 3 2 + L 3 3 + L 3 4 + L 3 5 ) =
= 0,2*( 0,05868+0,018+0,52812+0,054+1,467+0,09+2,87532+0,126+4,75308+0,162+5)= = 0,2*15,1322 = 3,02644
2.5 Построить графики решения дифференциального уравнения, аппроксимирующей (интерполяционной) функции.
График 1 — График решения дифференциального уравнения.
2.6 Составить блок-схемы алгоритмов и программы для приведенных решений на языке программирования высокого уровня.
Данные программы были написаны на языке программирования Ruby .
а) Программный код. Метод дихотомии (нахождение минимума и максимума).
def f(x) 5.868*x*x+0.18*x+1 end H = 0.1 A = 0.0 B = 1.0 def minimum(a,b,h) return (a..b) if b - a < h sigma = (b-a)/2*0.1 x1 = (a+b)/2-sigma x2 = (a+b)/2+sigma if f(x1) < f(x2) return minimum(a,(a+b)/2,h) else return minimum((a+b)/2,b,h) end
end def maximum(a,b,h) return (a..b) if b - a < h sigma = (b-a)/2*0.1
x1 = (a+b)/2-sigma
x2 = (a+b)/2+sigma if f(x1) > f(x2)
return maximum(a,(a+b)/2,h) else return maximum((a+b)/2,b,h) end end puts minimum(A,B,H) puts maximum(A,B,H)
рисунок
1. - Блок-схема 1.
рисунок
2. - Блок-схема 2.
рисунок
3. - Блок-схема 3.
б) Программный код. Метод Эйлера. def f(x,y) 2*(x*x+y) end x1 = 0.0 y1 = 1.0 H = 0.1 def step(pair, step=H) x,y = pair x2 = x + step fn = f(x,y) y2 = y + step * fn [x2,y2] end def dubstep(pair, step = H) x1,y1 = pair x1,y1 = step([x1,y1],step/2.0) x1,y1 = step([x1,y1],step/2.0) [x1,y1] end errors = [] while x1 < 1 - H error = (step([x1,y1])[1] - dubstep([x1,y1])[1]).abs errors << error x1,y1 = step([x1,y1]) puts "x = #{'%0.2f' % x1}, y = #{'%0.2f' % y1}, error = #{'%0.2f' % error}" end puts "Maximum error = #{errors.max}"
рисунок 4. - Блок-схема 4.
рисунок 5. - Блок-схема 5.
рисунок 6. - Блок-схема 6.
в) Программный код. Формула Лагранжа. X = [0,0.5,1] Y = [1,2.557,7.047] N = 2 def l(x,n,i) numerator = (0..n).to_a.reject{|z| z == i}.inject(1) {|mul,k| mul * (x - X[k])} denominator = (0..n).to_a.reject{|z| z == i}.inject(1) {|mul,k| mul * (X[i] - X[k])} numerator / denominator end x = ARGV[0].to_f puts (0..N).to_a.inject(0) {|sum,i| sum + Y[i]*l(x,N,i)}
рисунок 7. - Блок-схема 7.
рисунок 8. - Блок-схема 8.
г) Программный код. Формула Симпсона.
def f(x) 5.868*x*x+0.18*x+1 end def squares(a,b,n) h = (b-a)/n.to_f h*(1..n).to_a.inject(0){|sum,x| sum+f(a+h*(x-0.5))} end steps = 100 puts squares(0.0,1.0,steps)
рисунок
9. - Блок-схема 9.
