Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсач по инфе.doc
Скачиваний:
31
Добавлен:
01.08.2019
Размер:
419 Кб
Скачать

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.