Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Топ:
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Интересное:
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
2021-04-18 | 120 |
5.00
из
|
Заказать работу |
|
|
Для решения нескольких видов нелинейных уравнений с использованием пользовательской формы можно предложить калькулятор, показанный на рис. 2.5.1.
Рис. 2.5.1
Выбор уравнения осуществляется с помощью объектов OptionButton, при этом в объектах TextBox, обеспечивающих ввод пределов промежутка, в котором обнаружен корень, [ a; b ] и точность, устанавливается некоторый вариант, который при необходимости можно изменить.
Так при выборе нелинейного уравнения вида 2 x 3 + x 2 -3 x +2=0
устанавливается вариант расчета при a = -1,8, b = -1,7 и e = 0,00001.
При выборе других уравнений, устанавливаются варианты пределов промежутков и точности в соответствии с модулями, программно поддерживающими объекты OptionButton 2 и OptionButton 3.
Private Sub OptionButton1_Click()
TextBox1 = "-1,8"
TextBox2 = "-1,7"
TextBox3 = "0,00001"
End Sub
Private Sub OptionButton2_Click()
TextBox1 = "-1,2"
TextBox2 = "-1,1"
TextBox3 = "0,00001"
End Sub
Так как в модулях VBA, использовавшихся для вычисления значений корней применялись грамматические конструкции Function, не позволявшие определить количество итераций, то для определения количества итераций необходимо применить грамматические конструкции Sub.
Sub PolDel(a As Double, b As Double, e As Double, c As Double, ii As Integer)
ii = 0
10 c = (a + b) / 2
ii = ii + 1
If nel_ur_1(a) * nel_ur_1(c) < 0 Then b = c Else a = c
If Abs(a - b) >= e Then GoTo 10
End Sub
Sub Newton(a As Double, e As Double, x1 As Double, j As Integer)
Dim x As Double
x = a
x1 = x - nel_ur_1(x) / nel_ur_1D(x)
j = 1
While Abs(x - x1) > e
x = x1
x1 = x - nel_ur_1(x) / nel_ur_1D(x)
j = j + 1
Wend
End Sub
Sub Horda(a As Double, b As Double, delta As Double, c1 As Double, jj As Integer)
Dim c2 As Double
Fa = nel_ur_1(a)
Fb = nel_ur_1(b)
If Fa * Fb > 0 Then
MsgBox ("Интервал [a, b] выбран неправильно")
Exit Sub
End If
c1 = a - (b - a) / (Fb - Fa) * Fa
jj = 0
While Abs(c1 - c2) >= delta
Fa = nel_ur_1(a)
|
Fb = nel_ur_1(b)
Fc = nel_ur_1(c1)
If Fc * Fa > 0 Then b = c1: Fb = Fc Else a = c1: Fa = Fc
c2 = c1
c1 = a - (b - a) / (Fb - Fa) * Fa
jj = jj + 1
Wend
End Sub
Sub PolDel2(a As Double, b As Double, e As Double, c As Double, ii As Integer)
ii = 0
10 c = (a + b) / 2
ii = ii + 1
If nel_ur_2(a) * nel_ur_2(c) < 0 Then b = c Else a = c
If Abs(a - b) >= e Then GoTo 10
End Sub
Sub Newton2(a As Double, e As Double, x1 As Double, j As Integer)
Dim x As Double
x = a
x1 = x - nel_ur_2(x) / nel_ur_2D(x)
j = 1
While Abs(x - x1) > e
x = x1
x1 = x - nel_ur_2(x) / nel_ur_2D(x)
j = j + 1
Wend
End Sub
Sub Horda2(a As Double, b As Double, delta As Double, c1 As Double, jj As Integer)
Dim c2 As Double
Fa = nel_ur_2(a)
Fb = nel_ur_2(b)
If Fa * Fb > 0 Then
MsgBox ("Интервал [a, b] выбран неправильно")
Exit Sub
End If
c1 = a - (b - a) / (Fb - Fa) * Fa
jj = 0
While Abs(c1 - c2) >= delta
Fa = nel_ur_2(a)
Fb = nel_ur_2(b)
Fc = nel_ur_2(c1)
If Fc * Fa > 0 Then b = c1: Fb = Fc Else a = c1: Fa = Fc
c2 = c1
c1 = a - (b - a) / (Fb - Fa) * Fa
jj = jj + 1
Wend
End Sub
Грамматические конструкции Sub позволяют, в отличие от грамматических конструкций Function, в списке формальных параметров задать несколько выходных параметров. Вызов грамматических конструкций Sub осуществляется с помощью специального оператора вызова Call.
Поэтому в объекте CommandButton 1 пользовательской формы UserForm2 Решение нелинейных уравнений следует написать следующий программный модуль:
Private Sub CommandButton1_Click()
Dim a As Double, Ad As Double, Bd As Double
Dim An As Double, Ah As Double, bh As Double
Dim b As Double
Dim e As Double
Dim c As Double
Dim x1 As Double
Dim cc As Double
Dim i As Integer
Dim it As Integer
Dim jt As Integer
a = CDbl(TextBox1)
b = CDbl(TextBox2)
e = CDbl(TextBox3)
Ad = a: Bd = b
An = a:
Ah = a: bh = b
If OptionButton1 Then
Call PolDel(Ad, Bd, e, c, i)
TextBox4 = Format(c, "0.0000000000")
TextBox5 = i
Call Newton(An, e, x1, it)
TextBox8 = Format(x1, "0.0000000000")
TextBox9 = it
Call Horda(Ah, bh, e, cc, jt)
TextBox10 = Format(cc, "0.0000000000")
TextBox11 = jt
End If
If OptionButton2 Then
Call PolDel2(Ad, Bd, e, c, i)
TextBox4 = Format(c, "0.0000000000")
TextBox5 = i
Call Newton2(An, e, x1, it)
TextBox8 = Format(x1, "0.0000000000")
TextBox9 = it
Call Horda2(Ah, bh, e, cc, jt)
TextBox10 = Format(cc, "0.0000000000")
TextBox11 = jt
End If
End Sub
Некоторые комментарии к программе:
– фрагмент программы
Ad = a: Bd = b
An = a:
|
Ah = a: bh = b
обеспечивает запоминание начальных значений промежутка, в котором обнаружен корень [ a; b ], так при вычислениях в первой, по порядку, вызванной процедуре PolDel эти параметры принимают изменённые значения и при вызове в следующей, по порядку, процедуре Newton количество итераций определяется неправильно.
Использование пользовательской формы позволяет изменять значения промежутка, в котором обнаружен корень [ a; b ] и точность вычислений.
Так при точности e = 0,000000001 можно убедиться в полном совпадении значений корней вычисленных методом дихотомии, методом Ньютона и методом хорд и представленных в формате до десяти знаков после десятичной точки
- 1,7148059167.
При этом видно, что выбранная точность при использовании метода дихотомии достигается за 27 итераций, при использовании метода Ньютона – за 4 итерации и при использовании метода хорд – за 5 итераций.
Рис. 2.5.2
Аналогичные результаты, с точки зрения совпадения значений корней, можно получить и для второго уравнения 3 sin (x /2) = 2 x 2 – 4, рис. 2.5.3.
Рис. 2.5.3
С той только разницей, что совпадение значений корней до десятого разряда после десятичной точки произошло при точности e = 0, 0000000001 и число итераций, обеспечивших это совпадение, при методе дихотомии – 30, при методе Ньютона – 10, а при методе хорд – 3.
|
|
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!