| imho.ws |
![]() |
|
|
|
# 1 |
|
Guest
Сообщения: n/a
|
Привет!
Попадаю с паскалем, до 17 июня надо решить, иначе - ВИЛЫ Может сможете помочь моему удручающему положению? Зарание всем спасибо! Задание: Даны две функции ax^3+bx^2+cx+d=0 ax^2+bx+c=0 найти точку пересечения функций тремя способами 1) методом деления отрезка пополам (как я понимаю, в первом цикле задается максимальное и минимальное значение "х" , делится на 2 и выберается та половина где пересекаются функции, и цикл работает до тех пор пока "у" и "х" небудут равными у функций) 2) методом ручного преближения (вводиш "х" получаеш разброс по "у", и так до победы) 3) методом решения уравнений (а здесь тупо вводишь "a,b,c,d,x,y"-получаешь ответ) если конечно я правильно все понимаю... Еще раз всем спасибо! petr()ff |
|
|
# 3 | |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Насчет первого метода, кажись, должно быть так:
Код:
uses
crt;
const
e: real = 0.01; { точность }
function f (x: real): real;
begin
f := a * x * x * x +
(b - a) * x * x +
(c - b) * x +
(d - c);
end;
var
a, { коэффициент a }
b, { коэффициент b }
c, { коэффициент c }
d, { коэффициент d }
x0, { начало отрезка }
xn, { конец отрезка }
xm: real; { середина отрезка }
begin
clrscr;
write ('a = '); readln (a);
write ('b = '); readln (b);
write ('c = '); readln (c);
write ('d = '); readln (d);
write ('x0 = '); readln (x0);
write ('xn = '); readln (xn);
repeat
xm := (xn + x0) / 2;
if (f1 (x0) * f (xm)) < 0 then xn := xm
else x0 := xm;
until (xn - x0) <= e;
xm := (xn + x0) / 2;
writeln ('result = ', xm : 8 : 6);
readkey;
end.
З.Ы. Вот это - Цитата:
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! Последний раз редактировалось Ghost; 14.06.2004 в 16:47. |
|
|
|
|
|
# 4 |
|
Guest
Сообщения: n/a
|
Ghost дружище спасибо, за помощь!
Я неправильно написал фунции (ax^3+bx^2+cx+d=0;ax^2+bx+c=0 ) насамом деле они равняются =У , и выглядят так: ax^3+bx^2+cx+d=у ax^2+bx+c=у Это на самом деле функции, графики которых пересекаются , необходимо найти точку пересечения этих функций, Ответ должен выглядеть так- при X=... графики пересекаются (тоесть Y1=Y2) А по поводу второго метода, например при Х=5 графики пересекаются, мы произвольно вводим х=1, получаем ответ,что к примеру У1=1, У2=6, далее вводим Х=2 и видим что при этом значении игрики сближаются и составляют ,к примеру, У1=3 и У2=5, Если вводим Х=10 ,то видим что гафики расходятся, и так МЕТОДОМ РУЧНОГО ПОДБОРА определяем значение Х при котором графики пересекутся, По поводу третьего метода, необходимо алгебраическое решение ЕЩЕ РАЗ СПАСИБО ЗА ПОМОЩЬ!!! petr()ff |
|
|
# 5 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Второй метод, вот что получилось:
Код:
uses
crt;
var
a, b, c, d, x, xn, dx: real;
const
e: real = 0.01;
function f (x: real): real;
begin
f := a * x * x * x +
(b - a) * x * x +
(c - b) * x +
(d - c);
end;
begin
clrscr;
write ('a = '); readln (a);
write ('b = '); readln (b);
write ('c = '); readln (c);
write ('d = '); readln (d);
write ('x = '); readln (x);
dx := 1;
if abs(f(x)) < abs(f(x + dx)) then dx := -1;
while f(x) > e do begin
xn := x + dx;
if abs(f(xn)) > abs(f(x)) else dx := -0.5 * dx;
x := xn;
end;
writeln ('result = ', x : 8 : 6);
readkey;
end.
Третий метод, как я понял, фактически состоит в решении уравнения ax^3 + (b-a)x^2 + (c-b)x + (d-c) = 0 а я, хучь убей, не помню ни методов решения кубических уравнений в общем виде.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! Последний раз редактировалось Ghost; 14.06.2004 в 19:28. |
|
|
|
|
# 6 |
|
Full Member
Регистрация: 19.12.2003
Адрес: Москва
Пол: Male
Сообщения: 514
![]() ![]() ![]() |
Кубические весьма хреново решаются, надо сказать...
Общая идея такова.Пусть есть уравнение ax^3+bx^2+cx+d=0. Делаем подстановку x=z-b/3a, и то, что вышло, делим на a. Тогда наше уравнение превратится в z^3+3pz+2q=0 (коэффициенты 3 и 2 для удобства) Далее считаем... хз, как его называют, обзовём детерминантом: D=sqrt(p^3+q^2). Ну а теперь, z=root3(-q+D)+root(-q-D), x=z-b/3a. root3 - кубический корень. Остальные два корня вычисляются делением исходного уравнения на x-x0, где x0 - найденный корень. Получается квадратное уравнение, а уж его не помню, в каком классе проходят ![]() Осталась одна проблема - что делать, если детерминант не существует, то бишь мнимый (корень из отрицательного числа). Тогда приходится вспоминать теорию комплексных чисел... Всё досконально считать сейчас не буду, вкратце надо воот что сделать: Формула для корня будет выглядеть так: z=root3(a+bi)+root3(a-bi). a и b вычисляются через коэффициенты уравнения. Переводим a+bi в тригонометрический вид, считаем кубический корень и получаем наши "зеты", все три сразу. |
|
|