Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2009, 13:05   #1
Ti_pain)
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 39
По умолчанию

Нужно решить уравнения 4 степени и нарисовать график. Помагите найти пожалуйста ошибку)) я Сначала свожу уравнения 4-степени к 3 и решаю его методом Виета-Кардано(3 степень решает правельно) только в конце(при ответах 4 степени) получается что у меня перепутаны комплексные части корней,(Всмысли поменьть местами х1.і с х2.і и х3.і с х4.і и все ок). Только проблемка в том что при одних числах нужно поменть х1.і с х2.і, а при других х1.і с х3.і Помогите пожалуйста с етой проблемкой)

вот текст програмы:


Код:
procedure tform1.third(a1,a2,a3,a4:extended; var y:otvet);
var  Q, R, t, A, B: extended;
begin
 // --> x^3 + a2*x^2 + a3*x + a4 = 0
  a2 := a2/a1;   a3 := a3/a1;   a4 := a4/a1;

  Q := (sqr(a2) - 3*a3) / 9;
  R := (a2*(2*sqr(a2) - 9*a3) + 27*a4) / 54;

    // --> 3 дійсних корені.
  if sqr(R) < sqr(Q)*Q
  then begin
    t := ArcCos(R/sqrt(sqr(Q)*Q)) / 3;
    y[1].x:= -2*sqrt(Q)*cos(t) - a2/3;            y[1].y:= 0;
    y[2].x:= -2*sqrt(Q)*cos(t+(2*pi/3)) - a2/3;   y[2].y:= 0;
    y[3].x:= -2*sqrt(Q)*cos(t-(2*pi/3)) - a2/3;   y[3].y:= 0;
  end
  else begin
    A := - Power(Abs(R)+sqrt(sqr(R)-sqr(Q)*Q), 1/3);
    if R < 0 then A := - A;

    if A <> 0
    then B := Q / A
    else B := 0;

    y[1].x:=A + B - a2/3;    y[1].y:= 0;  // 1 дійсний корінь
    if A <> B
    then begin
     // ще 1 комплексний корінь
      y[2].x:= -(A+B)/2 - a2/3;     y[2].y:= - sqrt(3)*abs(A-B)/2;
    end
    else begin
     // ще 1 дйсний корінь
     y[2].x:= - A - a2/3;    y[2].y:= 0;
    end;
     // ще 1 комплексйни корінь або дублювання дійсного
     y[3].x:=y[2].x;    y[3].y:= -y[2].y;
  end;

end;

procedure tform1.fourth(a1,a2,a3,a4,a5:extended; var f:otvet);
var
  p, q, r: extended;
  z,z3:otvet;
  a2div4,prov,prov1: TComplex;
begin
   // --> x^4 + a2*x^3 + a3*x^2 + a4*x + a5 = 0
  a2 := a2/a1;      {a1 := 1;}
  a3 := a3/a1;
  a4 := a4/a1;
  a5 := a5/a1;
               a2div4.x:=- a2 / 4;      a2div4.y:=0;
   // --> x = y - a2/4
  // --> y^4 + p*y^2 + q*y + r = 0

  p := a3 - 3*sqr(a2)/8;
  q := a4 - a2*a3/2 + a2*a2*a2/8;
  r := sqr(a2)*a3/16 - 3*sqr(sqr(a2))/256 - a2*a4/4 + a5;
   a1:=1; a2:=p/2; a3:=(sqr(p)-4*r)/16; a4:=-sqr(q)/64;

// --> z^3 + p/2*z^2 + (p^2-4*r)/16*z - q^2/64 = 0

  Third(a1,a2,a3,a4, z);
for i:=1 to 3 do
       z3[i]:=csqrt(z[i]);

 prov1.x:=z3[1].x*z3[2].x-z3[1].y*z3[2].y;
 prov1.y:=z3[1].x*z3[2].y+z3[2].x*z3[1].y;
 prov.x:=prov1.x*z3[3].x-prov1.y*z3[3].y;
 prov.y:=prov1.x*z3[3].y+prov1.y*z3[3].x;

  //   y = sqrt(z1)+sqrt(z2)+sqrt(z3),
  // а x = sqrt(z1)+sqrt(z2)+sqrt(z3) - a2/4,
  //  коли sqrt(z1)*sqrt(z2)*sqrt(z3) = - q / 8;


if ( -( q / 8  )>0) and (prov.x>0)
  then begin
      // +++
     f[1].x:=z3[1].x+z3[2].x+z3[3].x+a2div4.x;
     f[1].y:=z3[1].y+z3[2].y+z3[3].y+a2div4.y;
      // +--
     f[2].x:=z3[1].x-z3[2].x-z3[3].x+a2div4.x;
     f[2].y:=z3[1].y-z3[2].y-z3[3].y+a2div4.y;
     // -+-
     f[3].x:=-z3[1].x+z3[2].x-z3[3].x+a2div4.x;
     f[3].y:=-z3[1].y+z3[2].y-z3[3].y+a2div4.y;
     // --+
     f[4].x:=-z3[1].x-z3[2].x+z3[3].x+a2div4.x;
     f[4].y:=-z3[1].y-z3[2].y+z3[3].y+a2div4.y;
  end
  else begin
     // ++-
     f[1].x:=z3[1].x+z3[2].x-z3[3].x+a2div4.x;
     f[1].y:=z3[1].y+z3[2].y-z3[3].y+a2div4.y;
     // +-+
     f[2].x:=z3[1].x-z3[2].x+z3[3].x+a2div4.x;
     f[2].y:=z3[1].y-z3[2].y+z3[3].y+a2div4.y;
     // -++
     f[3].x:=-z3[1].x+z3[2].x+z3[3].x+a2div4.x;
     f[3].y:=-z3[1].y+z3[2].y+z3[3].y+a2div4.y;
     // ---
     f[4].x:=-z3[1].x-z3[2].x-z3[3].x+a2div4.x;
     f[4].y:=-z3[1].y-z3[2].y-z3[3].y+a2div4.y;
   end;
end;
Может у когото есть рабчий алгоритм?) просто очень надо))

Может у когото есть модуль с комплексными числами(умнажения, корень и т.д) или алгоритм ришения уравнения?) Просто я не пойму где тупанул((

From Stilet: Почему код не оформляем? Кнопочка # для кого придумана, или ты не ищешь легких путей?

Последний раз редактировалось Stilet; 30.11.2009 в 11:46.
Ti_pain) вне форума Ответить с цитированием
Старый 02.12.2009, 17:08   #2
Ti_pain)
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 39
По умолчанию

Подскажите пожалуйста где моя ошибка?) Или может у когото есть уже решена ета задача или нормальный комплексный юнит?
Ti_pain) вне форума Ответить с цитированием
Старый 02.12.2009, 18:50   #3
Ti_pain)
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 39
По умолчанию

Всем спасибо кто читал и помагал)) просто комплексный юнит немного не идеальный не можно было сравнивать число типа реал с реальной частью комплексного числа + ище коринь в некоторых случиях не правельно искал))
Ti_pain) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi: Отделение корней уравнения графическим способом JustSmile Помощь студентам 1 29.11.2009 10:33
х в степени н anksunamun Помощь студентам 10 24.11.2009 00:31
корни уравнений n-й степени Delphi\C++ chandler Помощь студентам 7 14.05.2009 03:21
Решения одномерного дифференциального уравнения теплопроводности в частных производных (delphi) Denzloy Помощь студентам 1 27.01.2009 14:51
записать в Delphi 2 в степени 2.5 Godless Помощь студентам 1 03.12.2008 17:43