Vba_расчеты
.pdf2. Решение в Excel нелинейного уравнения
2.1.Встроенные и дополнительные средства решения
ВExcel имеется средство «Подбор параметра», которым часто пользуются для решения нелинейного уравнения. Рассмотрим следующий пример.
Пример 2.1. Найти с относительной погрешностью 0,001 корень урав-
нения x3 x2 0.1 0 на отрезке x [0; 2] . |
|
|
|
|
|
|
|
|
|
||
Для решения примера поместим в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
|
|
|
B |
|
|
ячейки A1 и B1 надписи «Аргумент» |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
и «Функция», присвоим (используя |
|
1 |
|
Аргумент |
|
|
Функция |
|
|||
Формулы, Присвоить имя) ячейкам |
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
=x^3-x^2-0,1 |
|
||
|
|
|
|
|
|
|
|
|
|||
A2 и B2 соответственно имена «x» и |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x |
Рис. 2.1. |
f |
|
||||
«f». Введѐм в ячейку B2 формулу |
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
(см. рис. 2.1). Далее можно выбрать: Данные, Анализ «что-если», Подбор параметра и искать решение в ручном режиме. Но мы воспользуемся следующим макросом и запустим его:
Sub Primer_2_1()
Application.MaxChange = 0.0001 ' «относительная погрешность»
Range("x") = 0. ' назначаем начальное приближение res = Range("f").GoalSeek(Goal:=0, ChangingCell:=Range("x")) Debug.Print res, Range("x"), Range("f")
End Sub
В результате в окне отладки получим:
True 1,08491453462296 -5,22345966353088E-05,
т.е. True – корень уравнения найден, он равен x 1,0849145, а «погрешность» относится не к корню, а к значению функции при найденном значении x.
Но если мы зададим лучшее начальное приближение (ближе к искомому корню) Range("x") = 0.65 , то результат окажется таков:
False -14355105132924,3 -2,95814278232263E+39,
31
т.е. корень не найден, подбор параметра не сработал. Не стоит особо удивляться этому, ведь это средство не предназначено специально для решения уравнений. Заметим, что если (см. задачу 1 в разделе 2.2) менять x на интервале (0; 1) с шагом dx=0.1, то при x=0.7, …,1.0 подбор параметра сработает, и корень будет найден.
Существуют надѐжные методы численного решения нелинейного уравнения f (x) 0 , один простой метод из их числа - метод деления отрезка пополам. Его идея состоит в том, что отрезок, на концах которого непрерывная функция имеет противоположные знаки, делится пополам, а затем выбирается для дальнейшего поиска та его половина, на концах которой знаки функции различные. Процесс деления продолжается до тех пор, пока отрезок [ , ], содержащий корень, не станет достаточно малым. Представим алгоритм данного метода на VBA в виде функции:
Function DOP(Fch As String, Xch As String, a As Double, _
b As Double, Optional Eps As Double = 0.0001, Optional Iter As _ Integer) As Boolean
' Fch, Xch - имена ячеек с функцией и аргументом,
'a, b - левая и правая границы отрезка, содержащего корень,
'Eps - относительная погрешность корня |X* - X|/max(|a|,|b|)<Eps,
'Iter - число выполненных приближений.
Dim Alpha As Double, Beta As Double, Sfa As Integer Dim X As Double, D As Double, Mabs As Double
'++++++++++++++++++++++++++++++++++++++++++++++++ Range(Xch) = a
Sfa = Sgn(Range(Fch)) Range(Xch) = b
Bisec = False
If Sfa * Sgn(Range(Fch)) > 0 Then Exit Function Mabs = IIf(Abs(a) > Abs(b), Abs(a), Abs(b))
If Eps < 0.000000000000005 Then Eps = 0.000000000000005 Alpha = a: Beta = b
Iter = 0
32
Do: Iter = Iter + 1
D = 0.5 * (Beta - Alpha)
X = Alpha + D: Range(Xch) = X
If D / Mabs <= Eps Then Exit Do
Select Case Sgn(Range(Fch)) * Sfa
Case 1: Alpha = X |
' |
f(X)*Sfa > 0 |
|
Case 0: |
Exit Do |
|
' f(X) = 0 |
Case -1: |
Beta = X |
' |
f(X)*Sfa < 0 |
End Select
Loop
DOP = True
End Function
Sub Primer_2_2( ) ' Пример 2.2. Запускающая процедура:
Dim N As Integer
res = DOP(Fch:="f", Xch:="x", a:=0, b:=3, Eps:=0.0001, Iter:=N) Debug.Print res, Range("x"), Range("f"), N
End Sub
Результат, выведенный в окно отладки:
True |
1,08489990234375 |
-7,21528830126827E-05 |
14 |
2.2. Задачи
1. Найти |
с относительной |
погрешностью 0,001 корень уравнения |
x3 x2 |
0.1 0 подбором параметра и методом половинного деле- |
|
ния на отрезке x [a; 2] |
для a=0; 0.1; …0.7. Сравнить полученные |
результаты.
2.Цилиндрическая автоцистерна для перевозки жидкости имеет в сечении форму эллипса с полуосями: a=1м, b=0.75м. Длина L цистерны составляет 4м. Цистерна установлена горизонтально. Для тарировки мерного щупа, опускаемого вдоль вертикальной оси эллипса, рассчи-
тать высоту h уровня налитой жидкости для объѐма V через каждые 0.5 м3 объѐма V. Построить график зависимости высоты h уровня от объѐма V. Указание. Зависимость объѐма V жидкости, налитой в
33
цистерну, от высоты h уровня жидкости выражается формулой:
V(h) ab arccos hb 1 a hb 1 (2b h) h L
построить в одних и тех же осях (с одинаковым масштабом единиц) графики зависимостей h(V), V(h) и h(h).
3.Ёмкость для хранения жидкости имеет форму сферы с радиусом R=1 м. Для тарировки мерного щупа, опускаемого по малой оси эл-
липсоида, рассчитать высоту h уровня налитой жидкости для объѐма V через каждые 0.1 м3 объѐма V. Построить график зависимости высоты h уровня от объѐма V. Указание. Зависимость объѐма V жидкости, налитой в ѐмкость, от высоты h уровня жидкости выражается
формулой: |
V(h) |
h2 |
3R h . Для сравнения построить в одних и |
|
|
3 |
|
тех же осях (с одинаковым масштабом единиц) графики зависимо-
стей h(V), V(h) и h(h).
4.Ёмкость для жидкости имеет форму, полученную вращением обра-
зующей r ln(1 z) [м] вокруг вертикальной оси oz . Высота ѐмкости 0,99 м. Для тарировки мерного щупа, опускаемого по оси oz ,
рассчитать высоту h уровня налитой жидкости для объѐма V через каждые 0.1 м3 объѐма V. Построить график зависимости высоты h уровня от объѐма V. Указание. Зависимость объѐма V жидкости, на-
литой в ѐмкость, от высоты h уровня жидкости выражается формулой: V(h) (1 z) ln(1 z) z . Для сравнения построить в одних и тех же осях (с одинаковым масштабом единиц) графики зависимо-
стей h(V), V(h) и h(h).
5. Рассчитать зависимость от температуры T [300 oK; 400 oK] тока I , проходящего через диод, при прямом включении источника ЭДС E 1 в . Принять, что диод моделируется последовательно соединѐнными резистором (выражающим объѐмное сопротивление RS ) и управляемым источником тока , для которого
|
|
V |
|
T |
|
|
Eg |
|
|
|
||
|
|
|
|
|
|
1 |
|
|
T |
|
||
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|||||||
I(V,T) Is(T) (eVT (T ) N 1) , а Is(T) IS e Tnom |
VT (T ) N |
|
|
|||||||||
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
Tnom |
||
где RS 1 ом , |
VT(T) 8.614 10 5 T в , |
N 1.4 , |
Tnom 300 oК , |
XTI
N ,
IS 10 14 А ,
34
Eg 1.11эв, XTI 3.
Указание. Напряжение на источнике тока равно: V E RS I(V,T) .
6.Асинхронный мотор вращает колесо воздуходувки. Рассчитать зависимость числа оборотов n и величину скольжения s ротора мотора
от относительной величины |
R Rротора подключенного к ротору |
добавочного сопротивления |
R , если известны: зависимость крутя- |
щего момента Mк (н·м) колеса от n (об/мин) Mк 2 10 5 n2 0.2 ; |
|
зависимость крутящего момента Mк (н·м) мотора от и величины |
|
скольжения s n0 n n ( n0 |
- синхронное число оборотов ротора): |
|
|
s |
|
|
|
sm 1 |
|
sm 0.1. |
|
Mк 200 |
|
|
|
|
|
|
, |
n0 1000об / мин , |
|
|
|
s |
|||||||
|
sm 1 |
|
|
|
|
7.Рассчитать зависимость максимальной скорости v движения автомобиля на прямой передаче с двигателем внутреннего сгорания от
угла |
подъѐма |
участка трассы |
с параметром |
сопротивления |
0 cos sin . |
Удельную тягу |
автомобиля |
принять равной |
|
T v 3 v 10 v 10 1 н / кг . Силу сопротивления движению вычис- |
||||
лять по формуле F cos sin m g c S v2 / 2. В расчетах при- |
||||
нять: |
масса автомобиля m 2000кг , |
ускорение свободного падения |
g 9.81 м/ сек2 , коэффициенты |
сопротивления 0 0.08, с 0.1, |
площадь поперечного сечения |
автомобиля S 1.96 м2 , плотность |
воздуха |
1.24 кг / м3 |
. Расчѐт выполнить для |
o o |
|
[0 ;18 ] , а изме- |
нение скорости ограничить диапазоном v 50/ 3.6 м/ сек;115/ 3.6 м/ сек .
8. Решить задачу 5 для автомобиля с двигателем, удельная тяга которого (на прямой передаче) изменяется по закону
T v 3 v10 0.2 v10 3 н / кг .
35
3. Представление данных в виде графиков и диаграмм 3.1. Построение графиков
Построение в Excel графика функции Y Y(X) по значениям Yi в
равноотстоящих точках Xi [a, b] отрезка [a, b] изменения аргумента выполняется следующим образом: выделяют столбец значений Yi , а затем используют цепочку вызовов Вставка, Диаграммы, График. При этом график будет построен не на шкале аргумента X , а на шкале индексов (номеров точек). Чтобы придать этой шкале вид оси аргумента X , меняют подпись горизонтальной оси, подставляя в еѐ диапазон числа из столбца X . Полученная картинка будет соответствовать графику Y Y(X) для однозначной функции при равноотстоящих значениях Xi .
В общем случае, когда график строится по массивам точек Xi и Yi ,
следует использовать точеные диаграммы. Рассмотрим их применение при решении следующей задачи.
Пример 3.1. Построить график функции Y F(X), заданной формулой «=X/КОРЕНЬ(1 + X ^ 2)» в ячейке B2. Для запоминания значений аргумента X, изменяющегося от -2 до +2 с шагом 0,1 , использовать ячейку A2.
Решение примера 3.1 начнѐм с оформления ячеек на рабочем листе: введѐм в ячейки A1 и B1 соответственно символы X и F, а ячейкам A2 и B2 присвоим имена X и F (выбрав предварительно Формулы на ленте). Введѐм формулу в ячейку B2. Оформим вычисление значений аргументов и функции в виде следующего макроса:
Sub PutXF() |
|
|
Const N As Integer = 40 |
' Число подинтервалов на [a; b]=[-2; 2]. |
|
H = (2 - (-2)) / N |
|
' Шаг по аргументу X. |
For i = 0 To N |
|
' Начало цикла по точкам графика. |
X = -2 + H * i |
' Значение аргумента X |
|
Range("X") = X |
' переслать в ячейку A2 для вычисления F(X) в B2 |
|
Cells(i + 3, 1) = X |
' и переслать в ячейку i+3 строки столбца A. |
|
Cells(i + 3, 2) = Cells(2, 2) |
' Скопировать значение F(X) в |
|
|
|
' ячейку строки i+3 столбца B. |
Next i |
|
' Конец цикла по точкам графика. |
|
|
36 |
End Sub
После исполнения макроса выделим заполненный числами диапазон
A3:B43 и выполним цепочку Вставка, Диаграммы, Точечная (с гладки-
ми кривыми) – на диаграмме должен появиться график (см. рис. 3.1).
Рис. 3.1.
3.2. Изображение плоских параметрических кривых
Точечные диаграммы (ТД) идеально подходят для изображения плоских параметрических кривых – кривых, X(t),Y(t)-координаты которых зависят от значения параметра t . Кривые r r( ) , заданные в полярных координатах, также могут рассматриваться как параметрические (с параметром ), если принять, что X r( ) cos( ), Y r( ) sin( ) . Рассмотрим построение таких кривых на следующем примере.
Пример 3.2. Изобразить на точечной диаграмме Excel полярные кривые r 20 a cos2 sin2 , [0, 2 ], /36, при каждом из значений параметра a 60,40, 20,0 .
Решение примера 3.2. Вычисление Xi , Yi -координат кривых выполним в макросе, и разместим координаты в столбцах A и B таблицы Excel, а значение параметра a будем выводить в столбец C в строку со значениями координат первой точки каждой кривой. Учтѐм особенность построения гладкий кривых (см. рис. 3.2) - координаты каждой последующей кривой (новой кривой, строящейся независимо от предыдущей) отделяются пустой строкой от координат предыдущей кривой.
37
Sub Rose() |
|
' Решение примера 3.2. |
||
Const N As Long = 36 |
' Число точек на кривой. |
|||
Const pi As Single = 3.1415927 |
|
|
||
i = 1 |
|
' Номер строки для выводимых координат. |
||
For a = 60 To 0 Step -20 |
' Цикл по параметру a |
|||
Cells(i, 3) = a |
|
' Запись в ячейку Excel значения параметра. |
||
For fi = 0 To 2 * pi + pi / N / 2 Step pi / N |
' Цикл по углу fi |
|||
r = Abs(20 + a * Abs(Cos(fi) ^ 2 - Sin(fi) ^ 2)) |
||||
x = r * Cos(fi): Cells(i, 1) = x |
' Запись в ячейки Excel |
|||
y = r * Sin(fi): |
Cells(i, 2) = y |
' |
x и y – координат. |
|
i = i + 1 |
' Номер следующей строки для вывода координат. |
|||
Next fi |
|
|
|
|
i = i + 1 ' Для пропуска строки после вывода координат кривой |
||||
Next a |
|
|
|
|
Call GR("A1:B" & i - 2) |
' Обращение к процедуре построения ТД |
|||
End Sub |
|
|
' с передачей в неѐ диапазона ячеек "A1:B295". |
|
Sub GR(rng As String) |
' Построение Точечной Диаграммы (ТД). |
ActiveSheet.Shapes.AddChart.Select ActiveChart.SetSourceData Source:=Range(rng)
ActiveChart.ChartType = xlXYScatterSmoothNoMarkers ' Тип ТД. ActiveChart.PlotArea.Select
ActiveChart.SetSourceData Source:=Range(rng)
End Sub
38
Рис. 3.2. Результат решения примера 3.2
3.3. Задачи
Варианты 1–10. Рассчитать x,y-координаты точек кривых (заданных в параметрической форме) для параметра t, изменяющегося на отрезке [tнач; t кон] с шагом t, при каждом из указанных значений a.
|
|
|
|
|
Таблица 3.1 |
|
|
|
|
|
|
||
№ |
Параметрическая кривая |
Значения аргумента |
Значение a |
|
||
|
|
tнач ; |
tкон ; |
t |
|
|
|
|
|
|
|
|
|
1 |
x(t) acos(t) |
0; |
2 ; |
/36 |
30; 40; ... 60 |
|
|
y(t) (a / 2)sin(t) |
|
|
|
|
|
|
|
|
|
|
|
|
2 |
x(t) sin( a t) |
0; |
2 ; |
/72 |
1; 2; ... 4 |
|
|
y(t) (1/ 2)sin(4t) |
|
|
|
|
|
|
|
|
|
|
|
|
3 |
x(t) 40(t asin(t)) |
0; |
2 ; |
/36 |
1;0.75; ..0.25 |
|
|
y(t) 40(1 acos(t)) |
|
|
|
|
|
|
|
|
|
|
|
|
4 |
x(t) 80cos(t) |
0; |
2 ; |
/36 |
0; /8; ... /2 |
|
|
y(t) 50sin(t a) |
|
|
|
|
|
|
|
|
|
|
|
|
5 |
x(t) 40cos(t) 20acos(2t) |
0; |
2 ; |
/72 |
0.5; 1.0; ..2.0 |
|
|
y(t) 40sin(t) 20asin(2t) |
|
|
|
|
|
|
|
|
|
|
|
|
6 |
x(t) 45cos(t) 15acos(3t) |
0; |
2 ; |
/72 |
0.5; 1.0; ..2.0 |
|
|
y(t) 45sin(t) 15asin(3t) |
|
|
|
|
|
|
|
|
|
|
|
|
7 |
x(t) 60cos(t) 15acos(4t) |
0; |
2 ; |
/72 |
0; 0.5; ... 2.0 |
|
|
y(t) 60sin(t) 15asin(4t) |
|
|
|
|
|
|
|
|
|
|
|
|
8 |
x(t) 20a(2 cos(t)) |
0; |
2 ; |
/36 |
0.5; 1.0; ..3.0 |
|
|
y(t) 20asin(t) |
|
|
|
|
|
|
|
|
|
|
|
|
9 |
x(t) (120 20a)cos(t) 20a |
0; |
2 ; |
/36 |
0; 1; ... 4 |
|
|
y(t) 2 (120 20a)sin(t) |
|
|
|
|
|
|
3 |
|
|
|
|
|
10 |
x(t) (4 a)t (12 3a)t2 |
0; |
1; |
0.02 |
0; 7.5; ... 30 |
|
|
(2a 8) t3 |
|
|
|
|
|
|
y(t) (4 a)(1 t)t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
|
|
|
|
Варианты 11–20. Рассчитать координаты точек кривых (заданных в полярных координатах) для полярного угла , изменяющегося на отрезке [ нач; кон] с шагом , при каждом из указанных значений a.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Таблица 3.2 |
|
|
|
|
|
|
|
|
|
|
|
|
||||
№ |
Кривая в полярных |
Значения аргумента |
Значение a |
||||||||||||
|
координатах |
нач ; |
кон ; |
|
|
|
|||||||||
11 |
r a |
|
|
|
|
|
|
0; |
2 ; |
/36 |
5; 7.5; ... 15 |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
12 |
r 30cos a |
0; |
2 ; |
/36 |
10; 25; ... 70 |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r a |
|
|
|
|
|
|
|
– /4; |
/4; |
/36 |
|
|
||
13 |
2cos2 |
80; |
70; ... 50 |
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
14 |
r asin 2 |
0; |
2 ; |
/36 |
50; |
60; ... 80 |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||
15 |
r |
|
a 20 | cos2 sin2 | |
|
0; |
2 ; |
/36 |
0; |
20; ... 60 |
||||||
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
||||||
16 |
r asin3 |
0; |
; |
/36 |
80; |
70; ... 50 |
|||||||||
|
|
|
|
|
|
|
|
|
|
||||||
17 |
r |
|
20 a | cos2 sin2 | |
|
0; |
2 ; |
/36 |
60; |
40; ... 0 |
||||||
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
||||||
18 |
|
|
|
|
|
|
|
|
|
|
0; |
2 ; |
/36 |
20; |
40; ... 80 |
r a / |
cos4 sin4 |
||||||||||||||
19 |
|
|
|
|
|
|
|
|
|
|
0; |
2 ; |
/36 |
80; |
60; ... 20 |
r a / 4 |
|
cos4 sin4 |
|||||||||||||
20 |
r a(cos 1) |
0; |
2 ; |
/36 |
20; |
40; ... 80 |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Контрольные значения, вычисленные при 2-ом значении аргумента и 1-ом значении параметра a.
|
|
|
|
|
Таблица 3.3 |
|
|
|
|
|
|
№ |
X* |
Y* |
№ |
X* |
Y* |
1 |
.298858E+02 |
.130734E+01 |
11 |
.434672E+00 |
.380289E–01 |
2 |
.436194E–01 |
.868241E–01 |
12 |
.397341E+02 |
.347628E+01 |
3 |
.442879E–02 |
.152212E+00 |
13 |
.361155E+02 |
–.303045E+02 |
|
|
|
|
|
|
4 |
.796956E+02 |
.435779E+01 |
14 |
.864937E+01 |
.756722E+00 |
|
|
|
|
|
|
5 |
.499239E+02 |
.873218E+00 |
15 |
.196212E+02 |
.171663E+01 |
|
|
|
|
|
|
6 |
.523930E+02 |
.983926E+00 |
16 |
.206267E+02 |
.180461E+01 |
|
|
|
|
|
|
7 |
.599429E+02 |
.261716E+01 |
17 |
.787875E+02 |
.689301E+01 |
|
|
|
|
|
|
8 |
.299619E+02 |
.871557E+00 |
18 |
.200758E+02 |
.175641E+01 |
|
|
|
|
|
|
9 |
.119543E+03 |
.697246E+01 |
19 |
.799988E+02 |
.699899E+01 |
|
|
|
|
|
|
10 |
.847360E–01 |
.784000E–01 |
20 |
.397720E+02 |
.347960E+01 |
|
|
|
|
|
|
|
|
40 |
|
|
|