Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 семестр / Решение уравнений.pdf
Скачиваний:
38
Добавлен:
09.04.2015
Размер:
369.21 Кб
Скачать

22

L = Sgn(M) * 2 / Abs(M) 'определить параметр ' Начать процесс итераций

x0 = a Do

x1 = x0 - L * f(x0) d = Abs(x1 - x0) x0 = x1

Loop Until d < e

MsgBox x1, , " Корень уравнения на отрезке [" & a & ", " & b & "]" End Sub

1.2.8.3 Метод Ньютона

Function f(x)

' вычисление функции f(x)

f = 5 ^ x - 6 * x - 3

End Function

 

Function f1(x)

' производная функции f(x)

f1 = Log(5) * 5 ^ x - 6

End Function

 

Function f2(x)

'вторая производная функции f(x)

f2 = Sqr(Log(5)) * 5 ^ x

End Function

Sub Newton() Const e = 0.0000001

Dim a As Double, b As Double, x As Double, M1 As Double

Dim M2 As Double, dx As Double, x0 As Double, x1 As Double, p As Double a = InputBox("Введите значение а")

b = InputBox("Введите значение b")

'Найти наибольшее значение модуля второй производной M2 = f2(a)

x = a

dx = 0.01 Do

x = x + dx p = f2(x)

If Abs(p) > Abs(M2) Then M2 = p

End If

Loop Until x > b

'Найти наименьшее значение модуля производной

M1 = Abs(f1(a)) x = a

dx = 0.01

23

Do

x = x + dx

p = Abs(f1(x))

If p < M1 Then M1 = p

End If

Loop Until x > b

If Sgn(M2) = Sgn(f(a)) Then x0 = a

Else x0 = b End If

' Начать процесс итераций Do

x1 = x0 - f(x0) / f1(x0) d = Sqr(Abs(x1 - x0)) x0 = x1

Loop Until d < 2 * M1 * e / Abs(M2) If Sgn(f(a)) <> Sgn(f(b)) Then

MsgBox x1, , " Корень уравнения на отрезке [" & a & ", " & b & "]" Else

MsgBox "Метод не применим" End If

End Sub

1.2.8.4 Метод хорд

Function f(x)

' вычисление функции f(x)

f = 5 ^ x - 6 * x - 3

 

End Function

 

Function f1(x)

'производная функции f(x)

f1 = Log(5) * 5 ^ x - 6

 

End Function

 

Function f2(x) 'вторая производная функции f(x)

f2 = Sqr(Log(5)) * 5 ^ x End Function

Sub Hord()

Const e = 0.0000001

Dim a As Double, b As Double, x As Double, M As Double Dim M1 As Double, dx As Double, err As integer, p As Double

24

a = InputBox("Введите значение а") b = InputBox("Введите значение b")

err = 0

If Sgn(f(a)) <> Sgn(f(b)) Then

' Установить вариант сужения интервала изоляции корня

If Sgn(f1(a)) = Sgn(f2(a)) Then v = 1

Else v = 2 End If

'Найти наибольшее значение модуля производной

M = Abs(f1(a)) x = a

dx = 0.01 Do

x = x + dx

p = Abs(f1(x))

If p > M Then M = p

End If

Loop Until x > b

'Найти наименьшее значение модуля производной

M1 = Abs(f1(a)) x = a

dx = 0.01 Do

x = x + dx

p = Abs(f1(x))

If p < M1 Then M1 = p

End If

Loop Until x > b

' Цикл уточнения корня

Do

x = a - f(a) * (b - a) / (f(b) - f(a)) If v = 1 Then

d = x - a a = x Else

d = b - x b = x End If

25

Loop Until d < M1 / (M - M1) * e MsgBox x, , "Корень уравнения" Else

MsgBox "Метод не применим" End If

End Sub

1.2.8.5 Комбинированный метод

Function f(x)

' вычисление функции f(x)

f = 5 ^ x - 6 * x - 3

 

End Function

 

Function f1(x)

'производная функции f(x)

f1 = Log(5) * 5 ^ x - 6

 

End Function

 

Function f2(x)

' вторая производная функции f(x)

f2 = Sqr(Log(5)) * 5 ^ x

 

End Function

 

Sub Kombi()

Const e = 0.0000001

Dim a As Double, b As Double, a1 As Double, b1 As Double, x As Double Dim err As integer, p As Double

a = InputBox("Введите значение а") b = InputBox("Введите значение b")

a1 = a

b1 = b err = 0

If Sgn(f(a)) <> Sgn(f(b)) Then

' Установить вариант сужения интервала изоляции корня If Sgn(f1(a)) = Sgn(f2(a)) Then

v = 1 Else v = 2 End If Do

If v = 1 Then

a1 = a1 - (f(a1) / (f(b1) - f(a1))) * (b1 - a1) b1 = b1 - f(b1) / f1(b1)

Else