Перейти к содержимому

Фотография

Решение уравнений с одним неизвестным


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 3

#1 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 04 октября 2009 - 16:11

Using the DB2 it is a very easy to create the simple Equation Solver.

For example you have to find the root of Equation
2 * SIN(x) = x

Transform this equation to f(X) = 2 * SIN(X) - X = 0.

One root could be find between -2 and -1 because
f(1) * f(2) = (2 *Sin(-1) + 1) * (2 * Sin(-2) + 2) = -1.23889187945779E-001 < zero.

So Xleft = -2.0 and Xright = -1.0....

When we find the boundaries we will iterate by finding the middle of the interval:

So, the first iteration of the X will be (-1.0 - 2.0) / 2 = -1.5.

Then we find where f(X) * f(Xright), or f(X) * f(Xleft) is less then 0.

If f(X) * f(Xright) > 0 we change Xright on (Xleft + Xright) / 2,
If f(X) * f(Xleft) > 0 we change Xleft on (Xleft + Xright) / 2.

We will finish the process when abs (Xleft - Xright) <= eps

with control_tbl (Equation, Xleft, Xright, eps) as 
(select '2 * sin(X) = X ==> 2 * sin(X) - X = 0', 
double(-2), double(-1), double(1.e-12)
from sysibm.sysdummy1
) 
,
eq_solution (Equation, Xleft, Xright, eps, X) as
(select ct.*, (Xleft + Xright) / 2
from control_tbl ct
union all
select Equation, 
case 
when (md.E_Function * lf.E_Function ) > 0 
then (Xleft + Xright) / 2 
else Xleft
end, 
case 
when (md.E_Function * rt.E_Function ) > 0 
then (Xleft + Xright) / 2 
else Xright
end, 
eps, 
(Xleft + Xright) / 2 
from eq_solution eq,
table(select 2 * sin (X) - X as E_Function 
from (select Xleft as X from sysibm.sysdummy1 ) ii) lf, 
table(select 2 * sin (X) - X as E_Function 
from (select Xright as X from sysibm.sysdummy1 ) ii) rt,
table(select 2 * sin (X) - X as E_Function 
from (select (Xleft + Xright) / 2 as X from sysibm.sysdummy1 ) ii) md

where abs(Xleft - Xright) > eps
) 
select Equation, abs(Xleft - Xright) "Real Accurancy", X "Equaty Solution" 
from eq_solution 
where abs(Xleft - Xright) <= eps


Result:

X = -1.89549426703434


P.S.
We can round result in same number of digits in fraction which has eps. ==> X = -1.895494267034

Lenny Khiger, ADSPA&VP
  • 0

#2 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 04 октября 2009 - 16:14

If interval is too big and on the end of interval function has the same sign, it doesn't mean the function has no roots on this interval....

We have to analyze function.

For example equation SIN(X) = 0 on interval [p/2, p/2 + 2pi]
has the same sign on the ends:

SIN(pi/2) = +1 and SIN(p/2 + 2pi) = +1.

But equation has 2 roots on this big interval:
SIN(pi) = 0 and SIN(2pi) = 0 are solutions.

To solve this situation you have to divide big interval on small parts and check sign on the ends of the small intervals.

Lenny Khiger, ADSPA&VP
  • 0

#3 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 04 октября 2009 - 16:51

Приведенный алгоритм и позволяет решать уравнения
от наипростейших x - 1 = 0 до наисложнейших e ^ six(3x) + e ^ cos(7x -1) - 4x^2 + 2 =0.

Это даже не сильно увеличивает время на решение.

Попробуйте решить уравнение 5x^3 + 4x^2 -3x -2 = 0 на интервале [0.0, 1.0].

Почему выбран такой интервал ?

Вы должны поменять:

control_tbl (Equation, Xleft, Xright, eps) as 
(select '2 * sin(X) = X ==> 2 * sin(X) - X = 0', 
double(-2), double(-1), double(1.e-12)
from sysibm.sysdummy1
)
......
table(select 2 * sin (X) - X as E_Function 
from (select Xleft as X from sysibm.sysdummy1 ) ii) lf, 
table(select 2 * sin (X) - X as E_Function 
from (select Xright as X from sysibm.sysdummy1 ) ii) rt,
table(select 2 * sin (X) - X as E_Function 
from (select (Xleft + Xright) / 2 as X from sysibm.sysdummy1 ) ii) md

Lenny Khiger, ADSPA&VP
  • 0

#4 LKhiger

LKhiger

    Активный участник

  • Members
  • PipPip
  • 76 сообщений
  • ФИО:Леонид Хигер
  • Город:NY

Отправлено 04 октября 2009 - 17:43

Кстати, вы можете сильно помочь своим детям, решая им сложные уравнения, или понижая уровень уравнения, когда один корень найден.... :blush: :dirol:
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных