Вычислить приближенное значение корня уравнения методом простых итераций - VB
Формулировка задачи:
Здравствуйте! Пытаюсь сделать лабораторную работу. Необходимо вычислить приближенное значение корня уравнения f(x)=0. Мое уравнение из задания (Ln(1+x)+3)^1/2-x. Еще надо показать результаты вычислений значения корня для заданных пяти вариантов допустимой ошибки 0,02; 0,005; 0,0002; 0,00005; 0,000002. Написать функцию, вычисляющую значение функции j(x), где j(x)=x.
Вот мой код:
Я не знаю, правильно или нет? Посмотрите пожалуйста. Не поняла как вставить │j’(x)│< 0,5.
Листинг программы
- Private Function f(ByVal x As Single) As Single
- f = (Log(1 + x) + 3) ^ 1 / 2 - x
- End Function
- Private Sub koren(ByVal pred As Integer, _
- ByVal a As Single, ByVal b As Single, ByVal eps As Single, _
- ByRef xw As Single, ByRef it As Integer, ByRef fxw As Single, ByRef Flag As Boolean)
- Dim xn As Single, xs As Single
- Dim fxn As Single, fxs As Single
- Dim Bool As Boolean
- xn = (a + b) / 2
- it = 0
- fxn = f(xn)
- Do
- xs = xn - fxn
- fxs = f(xs)
- it = it + 1
- Bool = Abs(xs - xn) > eps Or it > pred
- fxn = fxs
- Loop Until Bool
- If it <= pred Then
- Flag = False
- xw = xs
- fxw = f(xw) - xw
- Else
- Flag = True
- End If
- End Sub
Решение задачи: «Вычислить приближенное значение корня уравнения методом простых итераций»
textual
Листинг программы
- Option Explicit
- Const MaxIterations As Long = 10 ' Максиальное допустимое количество итераций
- ' Целевая функция
- Private Function Fx(ByVal x As Double) As Double
- ' Fx = Sqrt(Log(1 + x) + 3) - x
- Fx = (Log(1 + x) + 3) ^ 0.5 - x
- End Function
- ' Приближенное вычисление производной функции
- Private Function DFx(ByVal x As Double) As Double
- Const h As Double = 0.01
- DFx = (Fx(x + h) - Fx(x - h)) / (2 * h)
- End Function
- ' Функция G(x)
- Private Function Jx(ByVal x As Double, _
- ByVal C As Double) As Double
- Jx = x + Fx(x) / C
- End Function
- ' Нахождение корня методом простой итерации
- Private Function Iteration(ByVal a As Double, _
- ByVal b As Double, _
- ByVal eps As Double, _
- ByRef Flag As Boolean, _
- ByRef Iterations As Long) As Double
- Dim x As Double, x1 As Double, dFa As Double, dFb As Double, C As Double
- Iterations = 0 ' Счетчик итераций
- x1 = (a + b) / 2 ' Берем середину промежутка
- dFa = DFx(a) ' Значение производной в точке а
- dFb = DFx(b) ' Значение производной в точке б
- If Abs(dFa) > Abs(dFb) Then C = -dFa Else C = -dFb ' Вычислили C
- Do
- Iterations = Iterations + 1 ' Счетчик итераций
- x = x1 ' Запомнили x c предыдущей итерации
- x1 = Jx(x, C) ' Уточнили x
- Flag = Abs(x - x1) < eps ' True корень найден с заданной точностью
- Loop Until Flag Or Iterations > MaxIterations - 1 ' Конец цикла
- Iteration = x
- End Function
- Private Sub test1()
- Dim a As Double, b As Double, eps As Double, x As Double
- Dim EpsArr(), i As Long, Flag As Boolean, Iterations As Long
- a = 1
- b = 5
- eps = 0.000002
- EpsArr = Array(0.02, 0.005, 0.0002, 0.00005, 0.000002)
- For i = LBound(EpsArr()) To UBound(EpsArr())
- x = Iteration(a, b, EpsArr(i), Flag, Iterations)
- If Flag Then
- MsgBox "Eps = " & EpsArr(i) & " " & "Итераций " & Iterations & " " & " x= " & x & " F(x)=" & Fx(x)
- Else
- MsgBox "За " & Iterations & " Итераций корень не найден"
- End If
- Next
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д