diff --git a/_sources/appendix/solvecubic.md b/_sources/appendix/solvecubic.md
new file mode 100644
index 0000000..3e6ca35
--- /dev/null
+++ b/_sources/appendix/solvecubic.md
@@ -0,0 +1,71 @@
+(appendix_solvecubic)=
+# Решение кубического уравнения
+
+```{proof:function} solve_cubic
+
+**Решение кубического уравнения**
+
+:::julia
+"""
+ solve_cubic(a, b, c, d) -> Tuple{T,T,T}
+
+Решает в действительных числах кубическое уравнение вида
+
+a x³ + b x² + c x + d = 0
+
+Вовзвращает кортеж из трёх корней, где первые корни действительные,
+а комплексные корни представлены как not a number.
+"""
+function solve_cubic(a, b, c, d)
+ A, B, C, D = promote(float(a), float(b), float(c), float(d)) ./ (1, 3, 3, 1)
+ δ₁ = A * C - B * B
+ δ₂ = A * D - B * C
+ δ₃ = B * D - C * C
+ d13 = δ₁ * δ₃
+ d22 = δ₂ * δ₂
+ Δ = 4 * d13 - d22
+ nanvalue = zero(A) / zero(A)
+
+ if Δ < 0
+ At = Cb = Db = zero(A) # A-tilde, C-bar, D-bar
+ if B^3 * D ≥ A * C^3
+ At, Cb, Db = A, δ₁, -2 * B * δ₁ + A * δ₂
+ else
+ At, Cb, Db = D, δ₃, -D * δ₂ + 2 * C * δ₃
+ end
+ T₀ = -copysign(At, Db) * sqrt(-Δ)
+ T₁ = -Db + T₀
+ p = cbrt(T₁ / 2)
+ q = T₁ == T₀ ? -p : -Cb / p
+ x₁ = Cb ≤ 0 ? p + q : -Db / (p^2 + q^2 + Cb)
+ x, w = B^3 * D ≥ A * C^3 ? (x₁ - B, A) : (-D, x₁ + C)
+ return (x/w, nanvalue, nanvalue)
+ else
+ δ₁ == δ₂ == δ₃ == 0 && return (-B/A, -B/A, -B/A)
+ sΔ = sqrt(Δ)
+ θA, θD = abs.(atan.((A*sΔ, 2*B*δ₁ - A*δ₂, D*sΔ, D*δ₂ - 2*C*δ₃)) ./ 3)
+ sCA, sCD = sqrt.(.-min.((δ₁, δ₃), 0))
+ x₁A, x₁D = 2 .* (sCA, sCD) .* cos.((θA, θD))
+ x₃A, x₃D = .-((sCA, sCD)) .* (cos.((θA, θD)) .+ sqrt(3) .* sin.((θA, θD)))
+ xlt = (x₁A + x₃A > 2 * B) ? x₁A : x₃A
+ xst = (x₁D + x₃D < 2 * C) ? x₁D : x₃D
+ xl, wl = xlt - B, A
+ xs, ws = -D, xst + C
+ E = wl * ws
+ F = -xl * ws - wl * xs
+ G = xl * xs
+ xm, wm = C * F - B * G, C * E - B * F
+ return (xs/ws, xm/wm, xl/wl)
+ end
+end
+:::
+
+>Оригинальный алгоритм изложен в работе:
+>
+>J. F. Blinn.
+>How to Solve a Cubic Equation, Part 5: Back to Numerics.
+>IEEE Computer Graphics and Applications, V. 27, no. 3, pp. 78-89, 2007.
+>https://doi.org/10.1109/MCG.2007.60
+>
+>Имплементация взята из пакета [CubicEoS.jl](https://github.com/vvpisarev/CubicEoS.jl).
+```
diff --git a/_sources/integration/adaptive.ipynb b/_sources/integration/adaptive.ipynb
index c831b4e..34dedab 100644
--- a/_sources/integration/adaptive.ipynb
+++ b/_sources/integration/adaptive.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "38f79f96",
+ "id": "fa1d2fb2",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "c6345ec5",
+ "id": "3a0c1ffa",
"metadata": {},
"source": [
"(chapter_integration_adaptive)=\n",
@@ -48,7 +48,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "df476824",
+ "id": "4438d3fa",
"metadata": {},
"outputs": [
{
@@ -187,7 +187,7 @@
},
{
"cell_type": "markdown",
- "id": "118e80f1",
+ "id": "937be30f",
"metadata": {},
"source": [
"Видно, что данная функция по-разному \"изменчива\" на разных участках:\n",
@@ -202,7 +202,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "7480e6cd",
+ "id": "b1a1c73e",
"metadata": {},
"outputs": [
{
@@ -226,7 +226,7 @@
},
{
"cell_type": "markdown",
- "id": "dec9412d",
+ "id": "a4b8fbff",
"metadata": {},
"source": [
"`rombergwstep` отличается от {numref}`Функции {number} (romberg) ` только тем, что возвращает кортеж `(I[1, i], i)`. То есть, вычисления слева можно было бы закончить уже после 7 разбиений, однако при вычислении на всём участке потребовалось уже 13 разбиений.\n",
@@ -344,7 +344,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "58cfdd84",
+ "id": "ed83e729",
"metadata": {},
"outputs": [
{
@@ -883,7 +883,7 @@
},
{
"cell_type": "markdown",
- "id": "3ed75cda",
+ "id": "b5935262",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/integration/newton_cotes.ipynb b/_sources/integration/newton_cotes.ipynb
index b60e54d..2b7e6a3 100644
--- a/_sources/integration/newton_cotes.ipynb
+++ b/_sources/integration/newton_cotes.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "207409ec",
+ "id": "c6ed8448",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "b6ae22ad",
+ "id": "1427e931",
"metadata": {},
"source": [
"(chapters:integration:newton-cotes)=\n",
@@ -156,7 +156,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "53deabec",
+ "id": "1a7ff24e",
"metadata": {},
"outputs": [
{
@@ -551,7 +551,7 @@
},
{
"cell_type": "markdown",
- "id": "941f424e",
+ "id": "235d4eed",
"metadata": {},
"source": [
"```{raw} html\n",
@@ -662,7 +662,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "75a8f84a",
+ "id": "2ad71d4b",
"metadata": {},
"outputs": [
{
@@ -996,7 +996,7 @@
},
{
"cell_type": "markdown",
- "id": "f2f716f6",
+ "id": "4da725ca",
"metadata": {},
"source": [
"```{raw} html\n",
@@ -1124,7 +1124,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "e7b6c0ad",
+ "id": "84ab382e",
"metadata": {},
"outputs": [
{
@@ -1317,7 +1317,7 @@
},
{
"cell_type": "markdown",
- "id": "75e4ac39",
+ "id": "6de1f942",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/interpolation/cubic_spline.ipynb b/_sources/interpolation/cubic_spline.ipynb
index f70b549..e2b6b0e 100644
--- a/_sources/interpolation/cubic_spline.ipynb
+++ b/_sources/interpolation/cubic_spline.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "87c8a498",
+ "id": "22d846ad",
"metadata": {
"tags": [
"remove-cell"
@@ -43,7 +43,7 @@
},
{
"cell_type": "markdown",
- "id": "5521f190",
+ "id": "f2b0ee83",
"metadata": {},
"source": [
"# Кубические сплайны\n",
@@ -354,7 +354,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "06f511ab",
+ "id": "ffdfd301",
"metadata": {},
"outputs": [
{
@@ -549,7 +549,7 @@
},
{
"cell_type": "markdown",
- "id": "d7504e92",
+ "id": "33c9fbfe",
"metadata": {},
"source": [
"**Случай равноотстоящих точек**"
@@ -558,7 +558,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "8ac2ae63",
+ "id": "76cbb8c4",
"metadata": {},
"outputs": [
{
@@ -760,7 +760,7 @@
},
{
"cell_type": "markdown",
- "id": "7a70272e",
+ "id": "81a0e352",
"metadata": {},
"source": [
"**Оценка порядка сходимости**\n",
@@ -771,7 +771,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "265bf1e2",
+ "id": "4145db93",
"metadata": {},
"outputs": [
{
@@ -928,7 +928,7 @@
},
{
"cell_type": "markdown",
- "id": "a3cfb703",
+ "id": "2a5bdc15",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/interpolation/ex.ipynb b/_sources/interpolation/ex.ipynb
index cf5a7d5..f9087f1 100644
--- a/_sources/interpolation/ex.ipynb
+++ b/_sources/interpolation/ex.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "b4da4fcb",
+ "id": "6be74e20",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "ba0cd4d0",
+ "id": "4916b002",
"metadata": {},
"source": [
"# Задания\n",
@@ -98,7 +98,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "9984687f",
+ "id": "725b0472",
"metadata": {
"tags": [
"remove-input"
@@ -219,7 +219,7 @@
},
{
"cell_type": "markdown",
- "id": "630d3d35",
+ "id": "c8ecb9cc",
"metadata": {},
"source": [
"В качестве ответа вам необходимо предоставить следующее.\n",
diff --git a/_sources/interpolation/polynomial.ipynb b/_sources/interpolation/polynomial.ipynb
index 2082871..5f04e73 100644
--- a/_sources/interpolation/polynomial.ipynb
+++ b/_sources/interpolation/polynomial.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "632db79a",
+ "id": "528409c6",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "1e8a540b",
+ "id": "6e103b2f",
"metadata": {},
"source": [
"# Полиномиальная интерполяция\n",
@@ -155,7 +155,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "5c699023",
+ "id": "7582847d",
"metadata": {},
"outputs": [
{
@@ -348,7 +348,7 @@
},
{
"cell_type": "markdown",
- "id": "632d6152",
+ "id": "c0f34c37",
"metadata": {},
"source": [
"В целом выглядит неплохо, однако стоит добавить одну точку $t_i = 4.1$ во входные данные, и интерполянт сильно поменяется."
@@ -357,7 +357,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "95e4ae4e",
+ "id": "5e38549b",
"metadata": {},
"outputs": [
{
@@ -544,7 +544,7 @@
},
{
"cell_type": "markdown",
- "id": "49cb7254",
+ "id": "e34cb944",
"metadata": {},
"source": [
"```{raw} html\n",
@@ -577,7 +577,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "518dd17b",
+ "id": "e0b90f83",
"metadata": {},
"outputs": [
{
@@ -735,7 +735,7 @@
},
{
"cell_type": "markdown",
- "id": "12d4012e",
+ "id": "cce8a058",
"metadata": {},
"source": [
"Посмотрим на интерполянт."
@@ -744,7 +744,7 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "8011d32d",
+ "id": "244c5b41",
"metadata": {},
"outputs": [
{
@@ -908,7 +908,7 @@
},
{
"cell_type": "markdown",
- "id": "ee3a2082",
+ "id": "113d6cf2",
"metadata": {},
"source": [
"Что будет, если взять 15 точек? Данные с шумом не сильно изменились: это всё тот же \"холм\"."
@@ -917,7 +917,7 @@
{
"cell_type": "code",
"execution_count": 6,
- "id": "d4effccc",
+ "id": "9a85eccd",
"metadata": {},
"outputs": [
{
@@ -1055,7 +1055,7 @@
},
{
"cell_type": "markdown",
- "id": "4306bbe8",
+ "id": "b652d6f2",
"metadata": {},
"source": [
"Но интерполянт выглядит так."
@@ -1064,7 +1064,7 @@
{
"cell_type": "code",
"execution_count": 7,
- "id": "68acfccc",
+ "id": "31b1e6c4",
"metadata": {},
"outputs": [
{
@@ -1232,7 +1232,7 @@
},
{
"cell_type": "markdown",
- "id": "7a0daa43",
+ "id": "0a1e369b",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/interpolation/pwlinear.ipynb b/_sources/interpolation/pwlinear.ipynb
index 82ee229..4b3ede8 100644
--- a/_sources/interpolation/pwlinear.ipynb
+++ b/_sources/interpolation/pwlinear.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "330f82c8",
+ "id": "3d9520e0",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "78890f7c",
+ "id": "28beb6ac",
"metadata": {},
"source": [
"# Кусочно-линейная интерполяция\n",
@@ -140,7 +140,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "0889c3f8",
+ "id": "42a3509c",
"metadata": {},
"outputs": [
{
@@ -507,7 +507,7 @@
},
{
"cell_type": "markdown",
- "id": "f98c6d36",
+ "id": "d9b3bcd2",
"metadata": {},
"source": [
"```{raw} html\n",
@@ -576,7 +576,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "65e2afbb",
+ "id": "e1b3d912",
"metadata": {},
"outputs": [
{
@@ -769,7 +769,7 @@
},
{
"cell_type": "markdown",
- "id": "86f6ad3f",
+ "id": "76860bf6",
"metadata": {},
"source": [
"Возьмём большее число точек, на этот раз равноотстоящих."
@@ -778,7 +778,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "5bc42e00",
+ "id": "531b35fb",
"metadata": {},
"outputs": [
{
@@ -974,7 +974,7 @@
},
{
"cell_type": "markdown",
- "id": "ad396409",
+ "id": "f54bedff",
"metadata": {},
"source": [
"Похоже, интерполянт стремится к некоторому пределу...\n",
@@ -1063,7 +1063,7 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "8f20bb2e",
+ "id": "a24e9426",
"metadata": {},
"outputs": [
{
@@ -1219,7 +1219,7 @@
},
{
"cell_type": "markdown",
- "id": "be54c11e",
+ "id": "e3043fdf",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/intro/cond.ipynb b/_sources/intro/cond.ipynb
index 9cd5682..6e336a0 100644
--- a/_sources/intro/cond.ipynb
+++ b/_sources/intro/cond.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "markdown",
- "id": "d8189a3c",
+ "id": "ecfbeea1",
"metadata": {},
"source": [
"# Обусловленность задач\n",
@@ -146,7 +146,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "23c4b7e1",
+ "id": "2939ec81",
"metadata": {},
"outputs": [
{
@@ -174,7 +174,7 @@
},
{
"cell_type": "markdown",
- "id": "974b8f3f",
+ "id": "ecd9a786",
"metadata": {},
"source": [
"По цифрам в мантиссе видно, что детерминант вычислен с ошибкой (точное значение $0.005$). Посмотрим на относительную ошибку вычислений `err`"
@@ -183,7 +183,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "a754b865",
+ "id": "634c0a99",
"metadata": {},
"outputs": [
{
@@ -203,7 +203,7 @@
},
{
"cell_type": "markdown",
- "id": "f71e3dfe",
+ "id": "54a4bf0d",
"metadata": {},
"source": [
"Число обусловленности в точке $x=0.601$ равняется $\\kappa_\\det = 601$. Если теперь возмутить входные данные $x$ на погрешность, вносимую $\\float(x)$, т.е. на машинную точность $\\delta x = $ `eps(x)` вблизи $x$, получим"
@@ -212,7 +212,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "ce049cb5",
+ "id": "3f75b774",
"metadata": {},
"outputs": [
{
@@ -229,7 +229,7 @@
},
{
"cell_type": "markdown",
- "id": "ec112eea",
+ "id": "f6cc52b5",
"metadata": {},
"source": [
"Видно, что ошибка вычислений `err` совпадает с оценкой ошибки `err_estimate` по выражению {eq}`conderr`.\n",
diff --git a/_sources/intro/float.ipynb b/_sources/intro/float.ipynb
index f858d7b..01c31cc 100644
--- a/_sources/intro/float.ipynb
+++ b/_sources/intro/float.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "markdown",
- "id": "647afbd9",
+ "id": "db0d50e1",
"metadata": {},
"source": [
"# Числа с плавающей точкой\n",
@@ -140,7 +140,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "7666391d",
+ "id": "8a7aeb84",
"metadata": {},
"outputs": [
{
@@ -158,7 +158,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "e6c6c15a",
+ "id": "9dba88a3",
"metadata": {},
"outputs": [
{
@@ -178,7 +178,7 @@
},
{
"cell_type": "markdown",
- "id": "3699282d",
+ "id": "169d5ddf",
"metadata": {},
"source": [
"Функции `nextfloat` и `prevfloat` возвращают ближайшие следующее и предыдущее числа"
@@ -187,7 +187,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "c56ac5d7",
+ "id": "4b386856",
"metadata": {},
"outputs": [
{
@@ -211,7 +211,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "9e235a47",
+ "id": "e7b44e07",
"metadata": {},
"outputs": [
{
@@ -234,7 +234,7 @@
},
{
"cell_type": "markdown",
- "id": "4d884f5e",
+ "id": "bc58ba09",
"metadata": {},
"source": [
"Определённые в {eq}`floatpoint` экспоненту и мантиссу также можно получить"
@@ -243,7 +243,7 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "b35551c5",
+ "id": "015245a1",
"metadata": {},
"outputs": [
{
@@ -261,7 +261,7 @@
},
{
"cell_type": "markdown",
- "id": "ea5538f3",
+ "id": "b47e1057",
"metadata": {},
"source": [
"Расстояние между числами в диапазоне $[2^n, 2^{n+1})$ можно получить с помощью функции `eps(x)`.\n",
@@ -271,7 +271,7 @@
{
"cell_type": "code",
"execution_count": 6,
- "id": "c67d5b17",
+ "id": "66ca76fe",
"metadata": {},
"outputs": [
{
@@ -290,7 +290,7 @@
},
{
"cell_type": "markdown",
- "id": "b8f3c21b",
+ "id": "f7b9c8f3",
"metadata": {},
"source": [
"Пример вызова для для числа, отличного от `1.0`"
@@ -299,7 +299,7 @@
{
"cell_type": "code",
"execution_count": 7,
- "id": "0d0edc61",
+ "id": "6fc40567",
"metadata": {},
"outputs": [
{
@@ -320,7 +320,7 @@
},
{
"cell_type": "markdown",
- "id": "e0f45b2b",
+ "id": "58a85355",
"metadata": {},
"source": [
"Однако, стоит отметить, что `eps(x)` определяется как\n",
@@ -335,7 +335,7 @@
{
"cell_type": "code",
"execution_count": 8,
- "id": "8bb2f763",
+ "id": "6f83d7a7",
"metadata": {},
"outputs": [
{
@@ -356,7 +356,7 @@
},
{
"cell_type": "markdown",
- "id": "cb974bb8",
+ "id": "fbc4f510",
"metadata": {},
"source": [
"Наименьшее и наибольшее числа (но не `Inf` или `0`) получить можно так"
@@ -365,7 +365,7 @@
{
"cell_type": "code",
"execution_count": 9,
- "id": "d7e243fb",
+ "id": "87852ca6",
"metadata": {},
"outputs": [
{
@@ -382,7 +382,7 @@
},
{
"cell_type": "markdown",
- "id": "48c7c0b7",
+ "id": "3e9ccba3",
"metadata": {},
"source": [
"Специальные значения можно получить с помощью констант `Inf` и `NaN`"
@@ -391,7 +391,7 @@
{
"cell_type": "code",
"execution_count": 10,
- "id": "17e899c4",
+ "id": "ef1eac32",
"metadata": {},
"outputs": [
{
@@ -414,7 +414,7 @@
},
{
"cell_type": "markdown",
- "id": "2810827d",
+ "id": "878d12b4",
"metadata": {},
"source": [
"```{raw} html\n",
@@ -461,7 +461,7 @@
{
"cell_type": "code",
"execution_count": 11,
- "id": "f46d48f1",
+ "id": "63f8b701",
"metadata": {},
"outputs": [
{
@@ -480,7 +480,7 @@
},
{
"cell_type": "markdown",
- "id": "e78c52e3",
+ "id": "9f190fe2",
"metadata": {},
"source": [
"Ошибки округления копятся, например, можно вычислить\n",
@@ -493,7 +493,7 @@
{
"cell_type": "code",
"execution_count": 12,
- "id": "f9c4f464",
+ "id": "9e4dc8d9",
"metadata": {},
"outputs": [
{
@@ -513,7 +513,7 @@
},
{
"cell_type": "markdown",
- "id": "f6ec06c0",
+ "id": "f8a894eb",
"metadata": {},
"source": [
"При этом относительная ошибка копится"
@@ -522,7 +522,7 @@
{
"cell_type": "code",
"execution_count": 13,
- "id": "c3a2e874",
+ "id": "b0546164",
"metadata": {},
"outputs": [
{
@@ -546,7 +546,7 @@
},
{
"cell_type": "markdown",
- "id": "78dc54df",
+ "id": "523a3008",
"metadata": {},
"source": [
"% TODO\n",
@@ -566,7 +566,7 @@
{
"cell_type": "code",
"execution_count": 14,
- "id": "ef75e159",
+ "id": "ea44490f",
"metadata": {},
"outputs": [
{
@@ -585,7 +585,7 @@
},
{
"cell_type": "markdown",
- "id": "43d82e8c",
+ "id": "dacd5268",
"metadata": {},
"source": [
"Более прикладным примером является работа с числами разных порядков"
@@ -594,7 +594,7 @@
{
"cell_type": "code",
"execution_count": 15,
- "id": "4569ecaf",
+ "id": "db6d55f2",
"metadata": {},
"outputs": [
{
@@ -616,7 +616,7 @@
},
{
"cell_type": "markdown",
- "id": "bc4244a6",
+ "id": "e68fdd7e",
"metadata": {},
"source": [
"Машинный ноль {eq}`macheps_float64` на практике означает, что при сложении чисел двойной точности, отличающихся примерно в $10^{16}$ раз или более, одно из слагаемых потеряется"
@@ -625,7 +625,7 @@
{
"cell_type": "code",
"execution_count": 16,
- "id": "e52e1c42",
+ "id": "cb27d412",
"metadata": {},
"outputs": [
{
@@ -648,7 +648,7 @@
},
{
"cell_type": "markdown",
- "id": "0fc781e9",
+ "id": "ce5a20d2",
"metadata": {},
"source": [
"Ещё один пример неассоциативности. Он возникает на границе $2^n$ диапазонов $[2^{n-1}, 2^n)$ и $[2^n,2^{n+1})$\n",
@@ -661,7 +661,7 @@
{
"cell_type": "code",
"execution_count": 17,
- "id": "a15992d3",
+ "id": "ce038f18",
"metadata": {},
"outputs": [
{
@@ -680,7 +680,7 @@
},
{
"cell_type": "markdown",
- "id": "60952246",
+ "id": "44321e44",
"metadata": {},
"source": [
"## Меры предосторожности и практика работы с float-числами\n",
diff --git a/_sources/nlroot/bisection_regula_falsi.ipynb b/_sources/nlroot/bisection_regula_falsi.ipynb
index b12b42f..9f89581 100644
--- a/_sources/nlroot/bisection_regula_falsi.ipynb
+++ b/_sources/nlroot/bisection_regula_falsi.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "d35efec0",
+ "id": "2d7678c4",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "8b3c3586",
+ "id": "45053f82",
"metadata": {},
"source": [
"# Методы бисекции и regula falsi\n",
@@ -110,7 +110,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "8bcfbcb2",
+ "id": "af3de081",
"metadata": {},
"outputs": [
{
@@ -130,7 +130,7 @@
},
{
"cell_type": "markdown",
- "id": "9871cddf",
+ "id": "77132684",
"metadata": {},
"source": [
"```{raw} html\n",
@@ -207,7 +207,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "f300b0c0",
+ "id": "38652894",
"metadata": {},
"outputs": [
{
@@ -381,7 +381,7 @@
},
{
"cell_type": "markdown",
- "id": "62e3e5e9",
+ "id": "80f7444b",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/nlroot/ex.ipynb b/_sources/nlroot/ex.ipynb
index f28e480..4ec3dbf 100644
--- a/_sources/nlroot/ex.ipynb
+++ b/_sources/nlroot/ex.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "af61db13",
+ "id": "229ffca4",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "93f90e88",
+ "id": "ae91dc57",
"metadata": {},
"source": [
"# Задания\n",
@@ -101,7 +101,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "4447bf09",
+ "id": "644137ac",
"metadata": {},
"outputs": [
{
@@ -368,7 +368,7 @@
},
{
"cell_type": "markdown",
- "id": "517c2c28",
+ "id": "17857df0",
"metadata": {},
"source": [
"Рассмотрим подробнее изотерму для докритической температуры $T^* \\in (0, T_c)$.\n",
diff --git a/_sources/nlroot/itp.ipynb b/_sources/nlroot/itp.ipynb
index a72c0df..4f4b5c6 100644
--- a/_sources/nlroot/itp.ipynb
+++ b/_sources/nlroot/itp.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "cf54d9b8",
+ "id": "4a212c8d",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "bbc6fffa",
+ "id": "481aded3",
"metadata": {},
"source": [
"# ITP метод\n",
@@ -142,7 +142,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "363ea90f",
+ "id": "ff3a3176",
"metadata": {},
"outputs": [
{
@@ -162,7 +162,7 @@
},
{
"cell_type": "markdown",
- "id": "87a0d4b4",
+ "id": "5bdf87c0",
"metadata": {},
"source": [
"Если немного поменять функцию `itproot`, то можно увидеть, что метод справился с поиском корня за 8 итераций, тогда как бисекция требует 34. В то же время метод Риддерса справляется за 4 итерации, **но** он требует 8 вычислений функции (по два вычисления за итерацию).\n",
@@ -173,7 +173,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "1414e3a0",
+ "id": "3994c147",
"metadata": {},
"outputs": [
{
@@ -193,7 +193,7 @@
},
{
"cell_type": "markdown",
- "id": "399e30cf",
+ "id": "c5c51e71",
"metadata": {},
"source": [
"Здесь ITP потребовалось 8 вычислений, бисекции 34, а методу Риддерса 10.\n",
diff --git a/_sources/nlroot/newton_secant.ipynb b/_sources/nlroot/newton_secant.ipynb
index 47c20a9..80017ce 100644
--- a/_sources/nlroot/newton_secant.ipynb
+++ b/_sources/nlroot/newton_secant.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "56470e7c",
+ "id": "bc3d5789",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "d825a38a",
+ "id": "50a08513",
"metadata": {},
"source": [
"# Метод Ньютона и секущих\n",
@@ -103,7 +103,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "6c8f2a6e",
+ "id": "2c3b7957",
"metadata": {},
"outputs": [
{
@@ -125,7 +125,7 @@
},
{
"cell_type": "markdown",
- "id": "db6a0470",
+ "id": "784cd84f",
"metadata": {},
"source": [
"Помимо того, что метод Ньютона плохо обусловлен для корней с нулевой производной, также можно привести случай расхождения метода.\n",
@@ -140,7 +140,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "a0056f85",
+ "id": "c464d076",
"metadata": {},
"outputs": [
{
@@ -312,7 +312,7 @@
},
{
"cell_type": "markdown",
- "id": "f6b3988a",
+ "id": "3202c0e2",
"metadata": {},
"source": [
"```{raw} html\n",
@@ -394,7 +394,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "2cb855a7",
+ "id": "85002ba0",
"metadata": {},
"outputs": [
{
@@ -549,7 +549,7 @@
},
{
"cell_type": "markdown",
- "id": "c54639ce",
+ "id": "4a9447cf",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/nlroot/ridders.ipynb b/_sources/nlroot/ridders.ipynb
index b805899..a32f426 100644
--- a/_sources/nlroot/ridders.ipynb
+++ b/_sources/nlroot/ridders.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "c7a2b9e6",
+ "id": "dbd44d49",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "7b371a21",
+ "id": "c00893b8",
"metadata": {},
"source": [
"# Метод Риддерса\n",
@@ -148,7 +148,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "45650f47",
+ "id": "e8658107",
"metadata": {},
"outputs": [
{
@@ -167,7 +167,7 @@
},
{
"cell_type": "markdown",
- "id": "3988c05f",
+ "id": "9bf3741e",
"metadata": {},
"source": [
"Ниже на верхнем графике показано масштаб функции на отрезке. А на втором графике найденный методом Риддерса корень. Метод справился за 8 итераций с точностью локализации корня `xtol = 1e-6`."
@@ -176,7 +176,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "61473b14",
+ "id": "599916e4",
"metadata": {},
"outputs": [
{
@@ -399,7 +399,7 @@
},
{
"cell_type": "markdown",
- "id": "baca50cd",
+ "id": "46127b50",
"metadata": {},
"source": [
"Сравним с методом regula falsi. Для этого выставим для методов одинаковые `ftol`."
@@ -408,7 +408,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "bd1ceb67",
+ "id": "5b7697e4",
"metadata": {
"tags": [
"raises-exception"
@@ -443,7 +443,7 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "7ae1fecb",
+ "id": "b6bf7657",
"metadata": {},
"outputs": [
{
@@ -460,7 +460,7 @@
},
{
"cell_type": "markdown",
- "id": "708fe39d",
+ "id": "8c73825d",
"metadata": {},
"source": [
"Метод Риддерса обнаружил корень на отрезке за 8 итераций, тогда как regula falsi не справился за 1000.\n",
diff --git a/_sources/nlroot/simpleiter.ipynb b/_sources/nlroot/simpleiter.ipynb
index b8ae09e..e8eb2d7 100644
--- a/_sources/nlroot/simpleiter.ipynb
+++ b/_sources/nlroot/simpleiter.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "ab30c82c",
+ "id": "f4e906cf",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "3d4a3639",
+ "id": "078e76dc",
"metadata": {},
"source": [
"(chapter_nlroot_simpleiter)=\n",
@@ -134,7 +134,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "435c0e03",
+ "id": "df8712ca",
"metadata": {},
"outputs": [
{
@@ -153,7 +153,7 @@
},
{
"cell_type": "markdown",
- "id": "300ee3cc",
+ "id": "b1113b51",
"metadata": {},
"source": [
"Этот случай предсказывается ограничением на производную $g'(x) = -2x + 2$ в неподвижной точке $g'(1) = 0$.\n",
@@ -164,7 +164,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "2345bdfe",
+ "id": "c56c91c5",
"metadata": {
"tags": [
"raises-exception"
@@ -198,7 +198,7 @@
},
{
"cell_type": "markdown",
- "id": "b0fcacbe",
+ "id": "c507b01f",
"metadata": {},
"source": [
"Однако, можно взять другую функцию $g_1(x) = -f(x) + x$, для неё уже $g_1'(0) = 2x|_0 = 0$"
@@ -207,7 +207,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "f0119ec5",
+ "id": "7837843d",
"metadata": {},
"outputs": [
{
@@ -225,7 +225,7 @@
},
{
"cell_type": "markdown",
- "id": "0dc98c35",
+ "id": "8a98dc1c",
"metadata": {},
"source": [
"Аналогично приходится поступать и для более \"интересной\" функции $f(x) = xe^x - 2$, здесь $g(x) = -0.25 f(x) + x$"
@@ -234,7 +234,7 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "c4215a85",
+ "id": "c4cf2610",
"metadata": {},
"outputs": [
{
@@ -255,7 +255,7 @@
},
{
"cell_type": "markdown",
- "id": "6c7f95b9",
+ "id": "c539db89",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/ode/adaptive_rungekutta.ipynb b/_sources/ode/adaptive_rungekutta.ipynb
index 0bd795b..a71cb6c 100644
--- a/_sources/ode/adaptive_rungekutta.ipynb
+++ b/_sources/ode/adaptive_rungekutta.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "d19674d7",
+ "id": "7d42db33",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "2a42a27f",
+ "id": "9895ee24",
"metadata": {},
"source": [
"# Адаптивные методы\n",
@@ -210,7 +210,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "a50a0485",
+ "id": "06e25c33",
"metadata": {},
"outputs": [
{
@@ -609,7 +609,7 @@
},
{
"cell_type": "markdown",
- "id": "c6911a0e",
+ "id": "9dd80a78",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/ode/euler.ipynb b/_sources/ode/euler.ipynb
index cbf4c56..96a5679 100644
--- a/_sources/ode/euler.ipynb
+++ b/_sources/ode/euler.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "d7ebda52",
+ "id": "6f17b338",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "6ddd2d5b",
+ "id": "25caf5cc",
"metadata": {},
"source": [
"# Метод Эйлера\n",
@@ -201,7 +201,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "06566804",
+ "id": "4d5eddb9",
"metadata": {},
"outputs": [
{
@@ -389,7 +389,7 @@
},
{
"cell_type": "markdown",
- "id": "cc889751",
+ "id": "ba492478",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/ode/rungekutta.ipynb b/_sources/ode/rungekutta.ipynb
index f4f1a5e..0b3d2bb 100644
--- a/_sources/ode/rungekutta.ipynb
+++ b/_sources/ode/rungekutta.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "e43512c0",
+ "id": "699d0fe3",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "8284a1f0",
+ "id": "43037cf3",
"metadata": {},
"source": [
"# Методы Рунге-Кутта\n",
@@ -282,7 +282,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "9541d91a",
+ "id": "b9a160f2",
"metadata": {},
"outputs": [
{
@@ -715,7 +715,7 @@
},
{
"cell_type": "markdown",
- "id": "76594e28",
+ "id": "fa431845",
"metadata": {},
"source": [
"Невооруженным глазом видно, насколько лучше РК4 справляется с этой задачей, чем метод Эйлера (см. {numref}`Демонстрация %s `).\n",
@@ -726,7 +726,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "771ae2f6",
+ "id": "e10fb5e6",
"metadata": {},
"outputs": [
{
@@ -924,7 +924,7 @@
},
{
"cell_type": "markdown",
- "id": "c61133d0",
+ "id": "63d88dc9",
"metadata": {},
"source": [
"Построение нормы невязки подтверждает, что метод Эйлера обладает первым порядком сходимости, а метод РК4 -- четвёртым.\n",
diff --git a/_sources/ptstability/algorithm.md b/_sources/ptstability/algorithm.md
index 36686a0..b471e77 100644
--- a/_sources/ptstability/algorithm.md
+++ b/_sources/ptstability/algorithm.md
@@ -90,7 +90,7 @@ julia> ForwardDiff.jacobian(F, p)[end, end]
```{math}
:label: ptstab_chempot_stationary_system_ssi
-\ln{X_i^{k+1}} = h_i - \ln{\varphi_i(X^k_i)},\quad i=1,\dots,n.
+\ln{X_i^{k+1}} = h_i - \ln{\varphi_i(\boldsymbol{x}(\boldsymbol{X}^k))},\quad i=1,\dots,n.
```
В этой системе вектор неизвестных -- $[\ln{X_1}, \dots, \ln{X_n}]^\top$.
diff --git a/_sources/ptstability/index.md b/_sources/ptstability/index.md
index 3b4f264..4ae1bee 100644
--- a/_sources/ptstability/index.md
+++ b/_sources/ptstability/index.md
@@ -1,14 +1,23 @@
# PT стабильность
-В этом разделе изложена постановка и решение задачи проверки термодинамической стабильности однофазного состояния смеси веществ.
+Стандартный расчёт двухфазного фазового равновесия в флюидах проводится в два этапа.
+На первом этапе проверяется стабильность однофазного состояния.
+Если проверка показывает, что однофазное состояние не термодинамически равновесно, то производится второй этап --- фазовое расслоение.
-Решение этой задачи позволяет следующие характеристики фазового перехода типа флюид-флюид
+В этом разделе изложена постановка и решение задачи проверки термодинамической устойчивости (стабильности) однофазного состояния смеси веществ в изобарно-изотермических (PT) условиях.
+Проверка позволяет узнать, является ли однофазное состояние смеси равновесным или же в равновесии система состоит из более чем одной фазы.
-- бинодаль
-- спинодаль
-- положение критической точки
+Решение задачи проверки стабильности позволяет получить характеристики фазового перехода типа флюид-флюид:
-Также, в некоторых расчётах фазового равновесия на первой стадии проверяется стабильность, и, в случае нестабильного состояния, производится подсчёт равновесных параметров смеси.
+- бинодаль,
+- спинодаль,
+- положение критической точки.
+
+PT расчёт двухфазного равновесия может проводиться и без проверки стабильности.
+Однако, в многофазных расчётах проверка может использоваться, чтобы определить термодинамически равновесное число фаз.
+
+Побочным результатом проверки стабильности является состав фазы-зародыша (капли, пузырька).
+Этот состав может быть использован для построения начального приближения для фазового расслоения.
```{tip}
Основной материал построен на работах М. Микельсена {cite}`michelsen_1982_stability` и А. Брусиловского {cite}`Brusilovsky2002`.
diff --git a/_sources/ptstability/problem.md b/_sources/ptstability/problem.md
index a647e24..55ba17f 100644
--- a/_sources/ptstability/problem.md
+++ b/_sources/ptstability/problem.md
@@ -87,7 +87,10 @@ F(\boldsymbol{x}) = \sum_i x_i (\mu_i(\boldsymbol{x}) - \mu^0_i) \ge 0.
\mu_i = \hat{\mu}(T) + R T \ln \bigg( \frac{f_i}{[\text{ед. давления}]} \bigg),
```
-здесь $\hat{\mu}(T)$ -- химический потенциал идеального газа при единичном (референсном) давлении. Фактически, это поправка, зависящая только от температуры и не влияющая на утверждения о разности химических потенциалов в изотермических состояниях. Поскольку летучесть $f_i$ имеет размерность давления, под знаком логарифма в знаменателе стоит единица давления для обезразмеривания. Из определения следует, что для смеси идеальных газов $V \to \infty$, а $f_i = P$ и $\varphi_i = 1$.
+здесь $\hat{\mu}(T)$ -- химический потенциал идеального газа при единичном (референсном) давлении.
+Фактически, это поправка, зависящая только от температуры и не влияющая на утверждения о разности химических потенциалов в изотермических состояниях.
+Поскольку летучесть $f_i$ имеет размерность давления, под знаком логарифма в знаменателе стоит единица давления для обезразмеривания.
+Из определения следует, что для смеси идеальных газов $V \to \infty$, а $f_i = x_i P$ и $\varphi_i = 1$.
[^fugacity_introduced]: Термодинамическая величина "летучесть" (фугитивность, англ. *fugactity*) введена Г. Льюисом в 1901 году для сохранения простоты связи между изотермическим изменением химпотенциала и способности вещества переходить из одной системы в другую (физико-химические равновесия).
diff --git a/_sources/ptstability/vanderwaals.md b/_sources/ptstability/vanderwaals.md
index 7033340..f76f731 100644
--- a/_sources/ptstability/vanderwaals.md
+++ b/_sources/ptstability/vanderwaals.md
@@ -79,7 +79,10 @@ z^3 + (- B - 1) z^2 + A z - A B = 0,
```
где коэффициенты $A$ и $B$ определены ранее {eq}`ptstab_fugacity_coef_vdw_coefficients`. Из-за вида уравнения {eq}`ptstab_vdw_eos_cubic_z` уравнение состояния ван дер Ваальса относят к кубическому семейству.
-Уравнение на сжимаемость {eq}`ptstab_vdw_eos_cubic_z` может иметь до двух различных действительных корней. Меньший из них соотвествует жидкой (плотной) фазе, а больший корень -- газовой (менее плотной) фазе.
+Уравнение на сжимаемость {eq}`ptstab_vdw_eos_cubic_z` может иметь до двух различных действительных корней.
+Меньший из них соотвествует жидкой (плотной) фазе, а больший корень --- газовой (менее плотной) фазе.
+
+Для решения кубического уравнения воспользуйтесь функцией из Приложения {ref}`appendix_solvecubic`.
diff --git a/_sources/syslinear/decompose_overview.ipynb b/_sources/syslinear/decompose_overview.ipynb
index 8230994..a6efd9b 100644
--- a/_sources/syslinear/decompose_overview.ipynb
+++ b/_sources/syslinear/decompose_overview.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "f3d35b86",
+ "id": "e8a1414d",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "4a092e1e",
+ "id": "0bf73a32",
"metadata": {},
"source": [
"# Обзор других разложений и задач\n",
@@ -46,7 +46,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "152b0e1c",
+ "id": "ca000636",
"metadata": {},
"outputs": [
{
@@ -79,7 +79,7 @@
},
{
"cell_type": "markdown",
- "id": "6f0b6e1d",
+ "id": "a770baa3",
"metadata": {},
"source": [
"Знак детерминанта определяется чётностью перестановки. В данном случае для \"сортировки\" вектора перестановок `p` требуется три операции, поэтому необходимо домножение на $(-1)^3$.\n",
diff --git a/_sources/syslinear/lu.ipynb b/_sources/syslinear/lu.ipynb
index c88bc75..ddf0820 100644
--- a/_sources/syslinear/lu.ipynb
+++ b/_sources/syslinear/lu.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "ace898ca",
+ "id": "6c89f2e8",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "f821133f",
+ "id": "cc4ddeba",
"metadata": {},
"source": [
"# LU-разложение\n",
@@ -169,7 +169,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "526aebac",
+ "id": "56dd98c7",
"metadata": {},
"outputs": [],
"source": [
@@ -185,7 +185,7 @@
},
{
"cell_type": "markdown",
- "id": "3d0506c3",
+ "id": "3cb9f73d",
"metadata": {},
"source": [
"Первый шаг алгоритма основывается на {eq}`lu_row`: вычисляем первую строку `U`"
@@ -194,7 +194,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "29d9e22e",
+ "id": "eae0e32e",
"metadata": {},
"outputs": [
{
@@ -219,7 +219,7 @@
},
{
"cell_type": "markdown",
- "id": "a4b27edc",
+ "id": "66e91f6f",
"metadata": {},
"source": [
"Теперь вычислим первый столбец `L` {eq}`lu_col`"
@@ -228,7 +228,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "dd897922",
+ "id": "12bb6873",
"metadata": {},
"outputs": [
{
@@ -253,7 +253,7 @@
},
{
"cell_type": "markdown",
- "id": "e8d2b431",
+ "id": "9ad87d98",
"metadata": {},
"source": [
"Вычтем из `A₁` внешнее произведение первого столбца `L` и первой строки `U`"
@@ -262,7 +262,7 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "e6b9cc20",
+ "id": "494d8b32",
"metadata": {},
"outputs": [
{
@@ -286,7 +286,7 @@
},
{
"cell_type": "markdown",
- "id": "4ea44660",
+ "id": "b9f2cfbf",
"metadata": {},
"source": [
"$\\mathbf{A}_2 = \\mathbf{l}_2 \\mathbf{u}_2^\\top + \\mathbf{l}_3 \\mathbf{u}_3^\\top + \\mathbf{l}_4 \\mathbf{u}_4^\\top$. Так, задача свелась к предыдущей, на матрице размера $3 \\times 3$."
@@ -295,7 +295,7 @@
{
"cell_type": "code",
"execution_count": 6,
- "id": "3ce26f42",
+ "id": "f0078745",
"metadata": {},
"outputs": [
{
@@ -321,7 +321,7 @@
},
{
"cell_type": "markdown",
- "id": "f6bad5d8",
+ "id": "b5123276",
"metadata": {},
"source": [
"Предпоследний шаг"
@@ -330,7 +330,7 @@
{
"cell_type": "code",
"execution_count": 7,
- "id": "aea605a1",
+ "id": "22ffc5e0",
"metadata": {},
"outputs": [
{
@@ -356,7 +356,7 @@
},
{
"cell_type": "markdown",
- "id": "897331f6",
+ "id": "37c54c19",
"metadata": {},
"source": [
"И последний"
@@ -365,7 +365,7 @@
{
"cell_type": "code",
"execution_count": 8,
- "id": "c927960f",
+ "id": "8dcc5f18",
"metadata": {},
"outputs": [],
"source": [
@@ -374,7 +374,7 @@
},
{
"cell_type": "markdown",
- "id": "5590ea17",
+ "id": "b98f25b0",
"metadata": {},
"source": [
"Теперь известно разложение матрицы"
@@ -383,7 +383,7 @@
{
"cell_type": "code",
"execution_count": 9,
- "id": "c4fb0fbf",
+ "id": "5e02c651",
"metadata": {},
"outputs": [
{
@@ -408,7 +408,7 @@
{
"cell_type": "code",
"execution_count": 10,
- "id": "c17c9ef6",
+ "id": "b01b567a",
"metadata": {},
"outputs": [
{
@@ -432,7 +432,7 @@
},
{
"cell_type": "markdown",
- "id": "84c7b11c",
+ "id": "cb20dd01",
"metadata": {},
"source": [
"Проверим, что $\\mathbf{A} = \\mathbf{LU}$. Из-за погрешность вычислений с плавающей точкой, возможны неточности."
@@ -441,7 +441,7 @@
{
"cell_type": "code",
"execution_count": 11,
- "id": "20e19bd9",
+ "id": "e4b93bcf",
"metadata": {},
"outputs": [
{
@@ -465,7 +465,7 @@
},
{
"cell_type": "markdown",
- "id": "284c3cc7",
+ "id": "46f2cd56",
"metadata": {},
"source": [
"```{raw} html\n",
@@ -529,7 +529,7 @@
{
"cell_type": "code",
"execution_count": 12,
- "id": "a40fb6c6",
+ "id": "4c6a5409",
"metadata": {},
"outputs": [],
"source": [
@@ -539,7 +539,7 @@
},
{
"cell_type": "markdown",
- "id": "b09741b3",
+ "id": "9c37b433",
"metadata": {},
"source": [
"Сначала выполним разложение, а затем последовательно воспользуемся прямой и обратной подстановками"
@@ -548,7 +548,7 @@
{
"cell_type": "code",
"execution_count": 13,
- "id": "54a8aca0",
+ "id": "78343921",
"metadata": {},
"outputs": [
{
@@ -574,7 +574,7 @@
},
{
"cell_type": "markdown",
- "id": "a5c66143",
+ "id": "9d9285ab",
"metadata": {},
"source": [
"Невязка при этом составила"
@@ -583,7 +583,7 @@
{
"cell_type": "code",
"execution_count": 14,
- "id": "bbb5cce4",
+ "id": "2c32672b",
"metadata": {},
"outputs": [
{
@@ -607,7 +607,7 @@
},
{
"cell_type": "markdown",
- "id": "f0e09de7",
+ "id": "89ca2f08",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/syslinear/plu.ipynb b/_sources/syslinear/plu.ipynb
index 3ef6a62..b5a6087 100644
--- a/_sources/syslinear/plu.ipynb
+++ b/_sources/syslinear/plu.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "76d5422f",
+ "id": "52d0424e",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "994204c9",
+ "id": "19c425ee",
"metadata": {},
"source": [
"# PLU-разложение\n",
@@ -46,7 +46,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "a558f8e7",
+ "id": "5e8a3853",
"metadata": {},
"outputs": [
{
@@ -78,7 +78,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "331c68d0",
+ "id": "9405d810",
"metadata": {},
"outputs": [
{
@@ -102,7 +102,7 @@
},
{
"cell_type": "markdown",
- "id": "9743ea52",
+ "id": "04114799",
"metadata": {},
"source": [
"Матрицы разложения имеют `NaN` и `Inf` значения, возникшие в результате деления на ноль. При этом сама матрица обратимая."
@@ -111,7 +111,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "7aa24387",
+ "id": "89429dd7",
"metadata": {},
"outputs": [
{
@@ -128,7 +128,7 @@
},
{
"cell_type": "markdown",
- "id": "d5f8ef77",
+ "id": "70290890",
"metadata": {},
"source": [
"На первом шаге разложения всё в порядке"
@@ -137,7 +137,7 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "e4f5c514",
+ "id": "95184952",
"metadata": {},
"outputs": [
{
@@ -167,7 +167,7 @@
{
"cell_type": "code",
"execution_count": 6,
- "id": "4f8cd2b9",
+ "id": "f244ec4c",
"metadata": {},
"outputs": [
{
@@ -191,7 +191,7 @@
},
{
"cell_type": "markdown",
- "id": "a2faedbe",
+ "id": "1422a4b7",
"metadata": {},
"source": [
"Из вида матрицы `A₂` понятно, что на втором шаге возникнет деление на ноль. А именно, при присваивании матрице `U` новой строки всё нормально, первое деление на ноль возникает при подсчёте столбца матрицы `L`, поскольку `U[2, 2] == A₂[2, 2]`"
@@ -200,7 +200,7 @@
{
"cell_type": "code",
"execution_count": 7,
- "id": "8e134743",
+ "id": "c3c3cdbb",
"metadata": {},
"outputs": [
{
@@ -226,7 +226,7 @@
},
{
"cell_type": "markdown",
- "id": "62794f1a",
+ "id": "2caccff9",
"metadata": {},
"source": [
"Полученные `NaN` и `Inf` значения распроcтранятся в результате операции"
@@ -235,7 +235,7 @@
{
"cell_type": "code",
"execution_count": 8,
- "id": "888bf399",
+ "id": "d585db8c",
"metadata": {},
"outputs": [
{
@@ -259,7 +259,7 @@
},
{
"cell_type": "markdown",
- "id": "34168116",
+ "id": "2e9e4363",
"metadata": {},
"source": [
"```{raw} html\n",
@@ -296,7 +296,7 @@
{
"cell_type": "code",
"execution_count": 9,
- "id": "242ad384",
+ "id": "1f744c59",
"metadata": {},
"outputs": [],
"source": [
@@ -313,7 +313,7 @@
},
{
"cell_type": "markdown",
- "id": "97e323f8",
+ "id": "ff42e12a",
"metadata": {},
"source": [
"Но на этот раз будем производить выбор главного элемента."
@@ -322,7 +322,7 @@
{
"cell_type": "code",
"execution_count": 10,
- "id": "826bb367",
+ "id": "f9d477e7",
"metadata": {},
"outputs": [
{
@@ -342,7 +342,7 @@
},
{
"cell_type": "markdown",
- "id": "d3fda632",
+ "id": "08c41a16",
"metadata": {},
"source": [
"Функция `argmax` возвращает индекс наибольшего элемента массива. В качестве массива используется столбец из абсолютных значений столбца матрицы `A₁[:, 1]`.\n",
@@ -353,7 +353,7 @@
{
"cell_type": "code",
"execution_count": 11,
- "id": "842b3f29",
+ "id": "aa174725",
"metadata": {},
"outputs": [
{
@@ -379,7 +379,7 @@
},
{
"cell_type": "markdown",
- "id": "37bb33dd",
+ "id": "5c2898d1",
"metadata": {},
"source": [
"Завершим шаг"
@@ -388,7 +388,7 @@
{
"cell_type": "code",
"execution_count": 12,
- "id": "15f49f72",
+ "id": "9c4e23f9",
"metadata": {},
"outputs": [
{
@@ -412,7 +412,7 @@
},
{
"cell_type": "markdown",
- "id": "17269cfc",
+ "id": "4fd13b6a",
"metadata": {},
"source": [
"Поскольку главным элементом был четвёртый, то и `A₂` имеет нулевую четвёртую строку.\n",
@@ -423,7 +423,7 @@
{
"cell_type": "code",
"execution_count": 13,
- "id": "555a8d5c",
+ "id": "ef43df2a",
"metadata": {},
"outputs": [
{
@@ -454,7 +454,7 @@
},
{
"cell_type": "markdown",
- "id": "84e351ab",
+ "id": "887e88ab",
"metadata": {},
"source": [
"Мы действительно получили разложение $\\mathbf{A}=\\mathbf{LU}$"
@@ -463,7 +463,7 @@
{
"cell_type": "code",
"execution_count": 14,
- "id": "00d653cd",
+ "id": "953141a5",
"metadata": {},
"outputs": [
{
@@ -487,7 +487,7 @@
},
{
"cell_type": "markdown",
- "id": "77015fa2",
+ "id": "58dfc2fb",
"metadata": {},
"source": [
"При этом матрица $\\mathbf{U}$ имеет верхнетреугольную структуру"
@@ -496,7 +496,7 @@
{
"cell_type": "code",
"execution_count": 15,
- "id": "02c7aa99",
+ "id": "ca16bbb9",
"metadata": {},
"outputs": [
{
@@ -520,7 +520,7 @@
},
{
"cell_type": "markdown",
- "id": "b23bccd0",
+ "id": "b0d0d03e",
"metadata": {},
"source": [
"А матрица $\\mathbf{L}$ теперь не нижнетреугольная."
@@ -529,7 +529,7 @@
{
"cell_type": "code",
"execution_count": 16,
- "id": "a50905ef",
+ "id": "08784b61",
"metadata": {},
"outputs": [
{
@@ -553,7 +553,7 @@
},
{
"cell_type": "markdown",
- "id": "5800d354",
+ "id": "faad224e",
"metadata": {},
"source": [
"Чтобы восстановить структуру матрицы $\\mathbf{L}$, достаточно переставить в ней строки согласно последовательности выбора главных элементов. В нашем случае это были $4$, $3$, $1$ и $2$. В Julia это осуществляется с помощью следующего синтаксиса"
@@ -562,7 +562,7 @@
{
"cell_type": "code",
"execution_count": 17,
- "id": "2b91cefd",
+ "id": "2744838c",
"metadata": {},
"outputs": [
{
@@ -586,7 +586,7 @@
},
{
"cell_type": "markdown",
- "id": "5c87287f",
+ "id": "46188bb6",
"metadata": {},
"source": [
"*Voilà!*\n",
@@ -667,7 +667,7 @@
{
"cell_type": "code",
"execution_count": 18,
- "id": "e4b8cc9a",
+ "id": "e85076eb",
"metadata": {},
"outputs": [],
"source": [
@@ -677,7 +677,7 @@
},
{
"cell_type": "markdown",
- "id": "ba4a3540",
+ "id": "6dca32d9",
"metadata": {},
"source": [
"Как и в случае LU, cначала выполним разложение"
@@ -686,7 +686,7 @@
{
"cell_type": "code",
"execution_count": 19,
- "id": "71f1170b",
+ "id": "4856e99e",
"metadata": {},
"outputs": [
{
@@ -711,7 +711,7 @@
},
{
"cell_type": "markdown",
- "id": "529664bc",
+ "id": "a60d9830",
"metadata": {},
"source": [
"Однако, для решения системы нужно сначала сделать перестановку в векторе правой части $\\mathbf{b}$"
@@ -720,7 +720,7 @@
{
"cell_type": "code",
"execution_count": 20,
- "id": "088fb0bf",
+ "id": "51144bbd",
"metadata": {},
"outputs": [
{
@@ -745,7 +745,7 @@
},
{
"cell_type": "markdown",
- "id": "5352da93",
+ "id": "5d0c7358",
"metadata": {},
"source": [
"Невязка при этом составила"
@@ -754,7 +754,7 @@
{
"cell_type": "code",
"execution_count": 21,
- "id": "82d2de7b",
+ "id": "03729ebd",
"metadata": {},
"outputs": [
{
@@ -778,7 +778,7 @@
},
{
"cell_type": "markdown",
- "id": "4d53ce5e",
+ "id": "2bee104f",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/_sources/sysnonlinear/newton.ipynb b/_sources/sysnonlinear/newton.ipynb
index 5845c67..9ba2244 100644
--- a/_sources/sysnonlinear/newton.ipynb
+++ b/_sources/sysnonlinear/newton.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "2f6d82b3",
+ "id": "334f1002",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "f1134f19",
+ "id": "17df85f2",
"metadata": {},
"source": [
"# Метод Ньютона\n",
@@ -162,7 +162,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "eab97edc",
+ "id": "794bbb12",
"metadata": {
"tags": [
"remove-output"
@@ -200,7 +200,7 @@
},
{
"cell_type": "markdown",
- "id": "bf4beaf7",
+ "id": "c5117b78",
"metadata": {},
"source": [
"При наборе якобиана будьте внимательны. В Julia знак пробела или табуляция в литерале массивов означает горизонтальную конкатенацию. И в некоторых версиях языка `[x+y 0;]` (матрица `1 × 2`) может не быть эквивалентом `[x + y 0;]`.\n",
@@ -211,7 +211,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "8ee40820",
+ "id": "21353617",
"metadata": {},
"outputs": [
{
@@ -233,7 +233,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "6cfe0284",
+ "id": "c1228933",
"metadata": {},
"outputs": [
{
@@ -255,7 +255,7 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "87381bc2",
+ "id": "bcc1dda6",
"metadata": {},
"outputs": [
{
@@ -277,7 +277,7 @@
{
"cell_type": "code",
"execution_count": 6,
- "id": "1f3e59c3",
+ "id": "7194dfda",
"metadata": {},
"outputs": [
{
@@ -298,7 +298,7 @@
},
{
"cell_type": "markdown",
- "id": "bd0190e1",
+ "id": "62110002",
"metadata": {},
"source": [
"Так, найдено три корня системы.\n",
diff --git a/_sources/sysnonlinear/quasinewton.ipynb b/_sources/sysnonlinear/quasinewton.ipynb
index 4a0c381..6268ec6 100644
--- a/_sources/sysnonlinear/quasinewton.ipynb
+++ b/_sources/sysnonlinear/quasinewton.ipynb
@@ -3,7 +3,7 @@
{
"cell_type": "code",
"execution_count": 1,
- "id": "8834ddfa",
+ "id": "09803fb3",
"metadata": {
"tags": [
"remove-cell"
@@ -27,7 +27,7 @@
},
{
"cell_type": "markdown",
- "id": "728acc5c",
+ "id": "8af5aa20",
"metadata": {},
"source": [
"# Метод Бройдена\n",
@@ -120,7 +120,7 @@
{
"cell_type": "code",
"execution_count": 2,
- "id": "e8a4c949",
+ "id": "8424437c",
"metadata": {
"tags": [
"remove-output"
@@ -160,7 +160,7 @@
},
{
"cell_type": "markdown",
- "id": "4a4761d7",
+ "id": "0874090c",
"metadata": {},
"source": [
"Вычислим якобиан напрямую `Jexact`, и через конченые раности `Jfd`"
@@ -169,7 +169,7 @@
{
"cell_type": "code",
"execution_count": 3,
- "id": "bff72419",
+ "id": "c59dc909",
"metadata": {},
"outputs": [
{
@@ -214,7 +214,7 @@
},
{
"cell_type": "markdown",
- "id": "a4d681e4",
+ "id": "f3a1804a",
"metadata": {},
"source": [
"Отличие в данной точке получилось небольшим. В качестве меры невязки здесь приведена норма Фробениуса для матриц $\\sqrt{\\sum A_{ij}^2}$.\n",
@@ -339,7 +339,7 @@
{
"cell_type": "code",
"execution_count": 4,
- "id": "39c0542b",
+ "id": "d032b88d",
"metadata": {
"tags": [
"remove-output"
@@ -377,7 +377,7 @@
},
{
"cell_type": "markdown",
- "id": "6b46eb40",
+ "id": "be644d1f",
"metadata": {},
"source": [
"Сравним решения методом Бройдена, где в качестве $\\mathbf{B}_1$ сначала используется истинный якобиан, а затем его конечная разность"
@@ -386,7 +386,7 @@
{
"cell_type": "code",
"execution_count": 5,
- "id": "6b3cfebb",
+ "id": "25c04e02",
"metadata": {},
"outputs": [
{
@@ -410,7 +410,7 @@
},
{
"cell_type": "markdown",
- "id": "8ff53aeb",
+ "id": "c308961f",
"metadata": {},
"source": [
"Поищем также другие корни, не используя подлинный якобиан"
@@ -419,7 +419,7 @@
{
"cell_type": "code",
"execution_count": 6,
- "id": "558da4fc",
+ "id": "5414bf8f",
"metadata": {},
"outputs": [
{
@@ -442,7 +442,7 @@
{
"cell_type": "code",
"execution_count": 7,
- "id": "d798edb7",
+ "id": "53e01578",
"metadata": {},
"outputs": [
{
@@ -465,7 +465,7 @@
{
"cell_type": "code",
"execution_count": 8,
- "id": "dfe447ad",
+ "id": "4151b7e5",
"metadata": {},
"outputs": [
{
@@ -487,7 +487,7 @@
},
{
"cell_type": "markdown",
- "id": "1ca38910",
+ "id": "abae13bb",
"metadata": {},
"source": [
"```{raw} html\n",
diff --git a/appendix/bibliography.html b/appendix/bibliography.html
index 0a6bb28..d7007e7 100644
--- a/appendix/bibliography.html
+++ b/appendix/bibliography.html
@@ -60,7 +60,7 @@
-
+
@@ -179,7 +179,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -448,13 +448,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
@@ -749,10 +754,10 @@ Литература
-
+
next
-
Разложение Холецкого
+
Дополнительные материалы
diff --git a/appendix/cholesky.html b/appendix/cholesky.html
index d6a37a9..e121b7b 100644
--- a/appendix/cholesky.html
+++ b/appendix/cholesky.html
@@ -60,8 +60,7 @@
-
-
+
@@ -179,7 +178,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -447,16 +446,21 @@ Практикум по вычислите
Литература
-
-
- Разложение Холецкого
-
-
Дополнительные материалы
+
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
+
+
@@ -660,7 +664,7 @@ Разложение Холецкого
- Функция 1
+ Функция 2
(γξ)
@@ -686,7 +690,7 @@
Разложение Холецкого
-
Функция 2
+
Функция 3
(mcholesky!)
@@ -761,20 +765,13 @@
Разложение Холецкого
diff --git a/appendix/genindex.html b/appendix/genindex.html
index 64d8ebb..44b41b2 100644
--- a/appendix/genindex.html
+++ b/appendix/genindex.html
@@ -179,7 +179,7 @@
Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -448,13 +448,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/appendix/materials.html b/appendix/materials.html
index 59feb1a..9dec9d1 100644
--- a/appendix/materials.html
+++ b/appendix/materials.html
@@ -60,7 +60,8 @@
-
+
+
@@ -178,7 +179,7 @@
Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -446,16 +447,21 @@ Практикум по вычислите
Литература
-
-
- Разложение Холецкого
-
-
Дополнительные материалы
+
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
+
+
@@ -749,13 +755,20 @@ Дополнительные материалы
previous
-
Разложение Холецкого
+
Литература
+
+
+
next
+
Решение кубического уравнения
+
+
+
diff --git a/appendix/solvecubic.html b/appendix/solvecubic.html
new file mode 100644
index 0000000..799d3c8
--- /dev/null
+++ b/appendix/solvecubic.html
@@ -0,0 +1,802 @@
+
+
+
+
+
+
+
+
+ Решение кубического уравнения — Практикум по вычислительной теплофизике
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Toggle navigation sidebar
+
+
+
+
+ Toggle in-page Table of Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Решение кубического уравнения
+
+
+
+
+
+
+
+
+Решение кубического уравнения
+
+
+
+ Функция 1
+
+ (solve_cubic)
+
+
+
Решение кубического уравнения
+
"""
+ solve_cubic(a, b, c, d) -> Tuple{T,T,T}
+
+Решает в действительных числах кубическое уравнение вида
+
+a x³ + b x² + c x + d = 0
+
+Вовзвращает кортеж из трёх корней, где первые корни действительные,
+а комплексные корни представлены как not a number.
+"""
+function solve_cubic ( a , b , c , d )
+ A , B , C , D = promote ( float ( a ), float ( b ), float ( c ), float ( d )) ./ ( 1 , 3 , 3 , 1 )
+ δ₁ = A * C - B * B
+ δ₂ = A * D - B * C
+ δ₃ = B * D - C * C
+ d13 = δ₁ * δ₃
+ d22 = δ₂ * δ₂
+ Δ = 4 * d13 - d22
+ nanvalue = zero ( A ) / zero ( A )
+
+ if Δ < 0
+ At = Cb = Db = zero ( A ) # A-tilde, C-bar, D-bar
+ if B ^ 3 * D ≥ A * C ^ 3
+ At , Cb , Db = A , δ₁ , - 2 * B * δ₁ + A * δ₂
+ else
+ At , Cb , Db = D , δ₃ , - D * δ₂ + 2 * C * δ₃
+ end
+ T₀ = - copysign ( At , Db ) * sqrt ( - Δ )
+ T₁ = - Db + T₀
+ p = cbrt ( T₁ / 2 )
+ q = T₁ == T₀ ? - p : - Cb / p
+ x₁ = Cb ≤ 0 ? p + q : - Db / ( p ^ 2 + q ^ 2 + Cb )
+ x , w = B ^ 3 * D ≥ A * C ^ 3 ? ( x₁ - B , A ) : ( - D , x₁ + C )
+ return ( x / w , nanvalue , nanvalue )
+ else
+ δ₁ == δ₂ == δ₃ == 0 && return ( - B / A , - B / A , - B / A )
+ sΔ = sqrt ( Δ )
+ θA , θD = abs . ( atan . (( A * sΔ , 2 * B * δ₁ - A * δ₂ , D * sΔ , D * δ₂ - 2 * C * δ₃ )) ./ 3 )
+ sCA , sCD = sqrt . ( .- min . (( δ₁ , δ₃ ), 0 ))
+ x₁A , x₁D = 2 .* ( sCA , sCD ) .* cos . (( θA , θD ))
+ x₃A , x₃D = .- (( sCA , sCD )) .* ( cos . (( θA , θD )) .+ sqrt ( 3 ) .* sin . (( θA , θD )))
+ xlt = ( x₁A + x₃A > 2 * B ) ? x₁A : x₃A
+ xst = ( x₁D + x₃D < 2 * C ) ? x₁D : x₃D
+ xl , wl = xlt - B , A
+ xs , ws = - D , xst + C
+ E = wl * ws
+ F = - xl * ws - wl * xs
+ G = xl * xs
+ xm , wm = C * F - B * G , C * E - B * F
+ return ( xs / ws , xm / wm , xl / wl )
+ end
+end
+
+
+
+Оригинальный алгоритм изложен в работе:
+
J. F. Blinn.
+How to Solve a Cubic Equation, Part 5: Back to Numerics.
+IEEE Computer Graphics and Applications, V. 27, no. 3, pp. 78-89, 2007.
+https://doi.org/10.1109/MCG.2007.60
+
Имплементация взята из пакета CubicEoS.jl .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/genindex.html b/genindex.html
index ce187f2..80eedc4 100644
--- a/genindex.html
+++ b/genindex.html
@@ -445,13 +445,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/index.html b/index.html
index 2c96f5f..3bb0dec 100644
--- a/index.html
+++ b/index.html
@@ -449,13 +449,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/integration/adaptive.html b/integration/adaptive.html
index cbb68a9..ea9e463 100644
--- a/integration/adaptive.html
+++ b/integration/adaptive.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/integration/ex.html b/integration/ex.html
index 2cb3e24..3181695 100644
--- a/integration/ex.html
+++ b/integration/ex.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/integration/gauss.html b/integration/gauss.html
index 5d93179..406c190 100644
--- a/integration/gauss.html
+++ b/integration/gauss.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/integration/index.html b/integration/index.html
index 7c37945..68f2b9d 100644
--- a/integration/index.html
+++ b/integration/index.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/integration/newton_cotes.html b/integration/newton_cotes.html
index d91177a..30feef1 100644
--- a/integration/newton_cotes.html
+++ b/integration/newton_cotes.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/integration/romberg.html b/integration/romberg.html
index 3a36293..d5cf5b1 100644
--- a/integration/romberg.html
+++ b/integration/romberg.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/interpolation/cubic_spline.html b/interpolation/cubic_spline.html
index 9ae2f19..f688544 100644
--- a/interpolation/cubic_spline.html
+++ b/interpolation/cubic_spline.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/interpolation/ex.html b/interpolation/ex.html
index 65a4af8..96ae3ef 100644
--- a/interpolation/ex.html
+++ b/interpolation/ex.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/interpolation/index.html b/interpolation/index.html
index 67259b0..a5c7740 100644
--- a/interpolation/index.html
+++ b/interpolation/index.html
@@ -179,7 +179,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -448,13 +448,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/interpolation/polynomial.html b/interpolation/polynomial.html
index 6902041..e8b88cf 100644
--- a/interpolation/polynomial.html
+++ b/interpolation/polynomial.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/interpolation/pwlinear.html b/interpolation/pwlinear.html
index 5d5e280..9d9725c 100644
--- a/interpolation/pwlinear.html
+++ b/interpolation/pwlinear.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/intro/cond.html b/intro/cond.html
index c5c9075..3fc3513 100644
--- a/intro/cond.html
+++ b/intro/cond.html
@@ -181,7 +181,7 @@ Практикум по вычислите
- 1.10. Модули
+ 1.10. Модули и пакеты
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/intro/float.html b/intro/float.html
index 232b492..8d62915 100644
--- a/intro/float.html
+++ b/intro/float.html
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/intro/index.html b/intro/index.html
index afbdbab..ab72674 100644
--- a/intro/index.html
+++ b/intro/index.html
@@ -448,13 +448,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
diff --git a/julia/arrays.html b/julia/arrays.html
index f48fae8..3c667bf 100644
--- a/julia/arrays.html
+++ b/julia/arrays.html
@@ -450,13 +450,18 @@ Практикум по вычислите
-
- Разложение Холецкого
+
+ Дополнительные материалы
-
- Дополнительные материалы
+
+ Решение кубического уравнения
+
+
+
+
+ Разложение Холецкого
@@ -749,8 +754,8 @@