Помощь - Поиск - Пользователи - Календарь
Полная версия: решение кубического уравнения
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
BorisON
в общем пишу курсовик, нужна помощь
задание решение уравнений с одной переменной
линейное уравнение типа ax+b=0
квадратное уравнение ax^2+bx+c=0
были решены, загвоздка в кубическом уравнении x^3+ax^2+bx+c=0
прошу помочь решить, заранее спасибо

вот листинг программы
var a,b,c,d,x1,x2,x3,q,r,t : real;
begin
label14.Caption := '';
label15.Caption := '';
label16.Caption := '';
if radiobutton3.Checked = true then //ax+b=0
begin
a:=strtofloat(edit7.text);
b:=strtofloat(edit8.text);
x1:=-b/a;
label14.Caption :=floattostr (x1);
end
else if radiobutton2.Checked = true then //ax2+bx+c=0
begin
a:=strtofloat(edit4.text);
b:=strtofloat(edit5.text);
c:=strtofloat(edit6.text);
D:=b*b-4*a*c ;
if D>=0 then
begin
x1:=(-b-sqrt(d))/2*a;
x2:=(-b+sqrt(d))/2*a;
label14.Caption := floattostr(x1);
label15.Caption := floattostr(x2);
end
else
label14.Caption := 'уравнение не имеет корней';

end
else if radiobutton1.Checked = true then //x3+ax2+bx+c=0
begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
c:=strtofloat(edit3.text);
q:=(a*a-3*b)/9;
r:=(2*a*a*a-9*a*b+27*c)/54;
if r*r<q*q*q then
begin
{ t:=arccos(R/sqrt(q*q*q))/3; } //не работает, воспринимает почемуто arccos как переменную
x1:=-2*sqrt(q)*cos(t)-a/3;
x2:=-2*sqrt(q)*cos(t+(2*3.14/3))-a/3;
x3:=-2*sqrt(q)*cos(t-(2*3.14/3))-a/3;
label14.Caption := floattostr(x1);
label15.Caption := floattostr(x2);
label16.Caption := floattostr(x3);

end
else
begin
// дальше честно не знаю, как делать
end;
end;
end;
мисс_граффити
посмотри эту тему:
Численные методы решения уравнений
или смотри в сторону формулы Кардано:
http://www.school.mipt.ru/Forum.asp?ForumI...e=5&MsgID=22149
http://ru.wikipedia.org/wiki/Формула_Кардано
BorisON
тогда ещё несколько вопросов blink.gif
допустим это я вычислю Q=(a2-3b)/9, R=(2a3-9ab+27c)/54
A=-sign®[|R|+sqrt(R2-Q3)]1/3 а как понять эту формулу и какой у неё будет синтаксис в дельфи?
B=Q/A при A!=0 или B=0 при A=0.
Дмитрий
sqrt - это корень. sign вообще по идее значит signum (от лат. "знак").
мисс_граффити
Цитата
B=Q/A при A!=0 или B=0 при A=0.

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

это в идеале. но поскольку для вещественных чисел существует погрешность, лучше написать
if abs(A)>eps then
B:=Q/A
else
B:=0;

где eps-некоторое маленькое положительное число (например, 0.00001)
BorisON
ладно, мы не ищем простых решений
вот переделанный код
появилась ошибка "invalid floating point operation"
просьба помочь с решением проблемы!
вот листинг программы
  begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
c:=strtofloat(edit3.text);
d:=strtofloat(edit9.text);
p:=-(b*b)/(3*a*a)+c/a;
q:=(2*b*b*b)/(27*a*a*a)-(b*c)/(3*a*a);
a1:=(-q/2)+sqrt((q*q)/4+(p*p*p)/27);
a1:=exp((1/3) * ln(a1));
b1:=(-q/2)-sqrt((q*q)/4+(p*p*p)/27);
b1:=exp((1/3) * ln(b1));
if (q*q)/4+(p*p*p)/27>0 then
begin
x1:=a1+b1;
x2:=-0.5*(a1+b1)+(sqrt(3)/2)*(a1-b1);
x3:=-0.5*(a1+b1)-(sqrt(3)/2)*(a1-b1);
end
else if (q*q)/4+(p*p*p)/27=0 then
begin
x1:=2*a1;
x2:=-a1;
x3:=-a1;
end
else
showmessage('введите корректные значения');

label14.Caption := floattostr(x1);
label15.Caption := floattostr(x2);
label16.Caption := floattostr(x3);
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.