Еngee как альтернатива PascalABC
Автор
Соавторы
Решение нелинейных уравнений. ЛР №15
Функции для методов численного решения нелинейных уравнений
Функция для метода деления пополам
In [ ]:
x = 0:0.1:100
Fun1(x) = x + sqrt(x) + exp((1/3) * log(x)) - 2.5;
plot(x, Fun1.(x))
Out[0]:
Функции для метода итераций
In [ ]:
x = 0:0.1:500
Fun2(x) = (3.8/0.35)-(3/0.35)*sin(sqrt(x));
plot(x, Fun2.(x))
Out[0]:
In [ ]:
x = 0:0.1:100
Fun5(x) = 3 * sin(sqrt(x)) + 0.35 * x - 3.8;
plot(x, Fun5.(x))
Out[0]:
Функции для метода Ньютона
In [ ]:
x = -100:0.1:100
Fun3(x) = 0.25 * x^3 + x -1.2502;
plot(x, Fun3.(x))
Out[0]:
In [ ]:
x = -100:0.1:100
Fun4(x) = 0.75 * x^2 + 1;
plot(x, Fun4.(x))
Out[0]:
Методы решения нелинейных уравнений
Метод деления пополам
In [ ]:
function МДП(a, b, ε)
c = (a+b) / 2;
while abs(a-b) > ε
c = (a+b) / 2;
if Fun1(a) * Fun1(c) < 0
b = c;
else
a = c;
end
end
return c
end;
Метод простых итераций
In [ ]:
function МПИ(x, ε)
x1 = x + 2 * ε
while abs(x1-x) > ε
x = x1;
x1 = Fun2(x);
end
return x
end;
Метод Ньютона
In [ ]:
function МН(x, ε);
while (abs(Fun3(x))>ε)
x=x-Fun3(x)/Fun4(x);
end
return x
end;
Расчёты полученными методами
Расчёт методом деления пополам
In [ ]:
using Printf
a1 = 0.1 # @param {type:"number"}
b1 = 0.8 # @param {type:"number"}
ε = 1e-5
# Проверяем, есть ли корни на интервале [a, b]
if Fun1(a1) * Fun1(b1) < 0
# Вызываем функцию для решения методом деления пополам
x1 = МДП(a1, b1, ε)
@printf("Полученное значение x=%.4f f(x)=%.9f\n", x1, Fun1(x1))
else
println("Корней нет")
end
In [ ]:
xr1 = a1:0.001:b1
plot(xr1, Fun1.(xr1), label="f(x) = x + √x + exp((1/3)log(x)) - 2.5", xlabel="x", ylabel="f(x)", title="Метод деления пополам")
scatter!([x1], [Fun1(x1)], markersize=5, color="red", label="Точка пересечения")
Out[0]:
Расчёт методом простых итераций
In [ ]:
a2 = 1 # @param {type:"number"}
b2 = 3 # @param {type:"number"}
ε = 1e-5
# Проверяем, есть ли корни на интервале [a, b]
if Fun5(a2) * Fun5(b2) < 0
# Вызываем функцию для решения методом итераций
x2 = МПИ(a2, ε)
@printf("Полученное значение x=%.4f f(x)=%.9f\n", x2, Fun5(x2))
else
println("Корней нет")
end
In [ ]:
xr2 = a2:0.001:b2
plot(xr2, Fun5.(xr2), label="f(x) = 3 * sin(√x) + 0.35x - 3.8", xlabel="x", ylabel="f(x)", title="Метод простых итераций")
scatter!([x2], [Fun5(x2)], markersize=5, color="red", label="Точка пересечения")
Out[0]:
Расчёт методом Ньютона
In [ ]:
a3 = 0 # @param {type:"number"}
b3 = 2 # @param {type:"number"}
ε = 1e-5
if Fun3(a3) * Fun3(b3) < 0
# Вызываем функцию Newton для решения методом Ньютона
x3 = МН(a3, ε)
@printf("Полученное значение x=%.4f f(x)=%.9f\n", x3, Fun3(x3))
else
println("Корней нет")
end
In [ ]:
xr3 = a3:0.001:b3
plot(xr3, Fun3.(xr3), label="f(x) = 3 * sin(√x) + 0.35x - 3.8", xlabel="x", ylabel="f(x)", title="Метода Ньютона")
scatter!([x3], [Fun3(x3)], markersize=5, color="red", label="Точка пересечения")
Out[0]: