IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Паскаль! Sos (http://www.imho.ws/showthread.php?t=61655)

petr()ff 13.06.2004 19:01

Паскаль! Sos
 
Привет!

Попадаю с паскалем, до 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

EvroStandart 14.06.2004 16:23

Тут кроме паскаля надо рубить в давно забытой математике ...
Слишком мало времени. :(

Ghost 14.06.2004 16:41

Насчет первого метода, кажись, должно быть так:
Код:

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.

Насчет второго метода - я не понял, что имеется ввиду - метод итераций для решения систем линейных уравнений? или что?

З.Ы. Вот это -
Цитата:

ax^3+bx^2+cx+d=0
ax^2+bx+c=0
- не функции, а уравнения. Так что объясни, это существенно - равенство нулю? а то может просто при каких-нибудь коэффициентах a, b, c и d - оба уравнения будут иметь разные решения, т.е. различные значения x.

petr()ff 14.06.2004 18:03

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

Ghost 14.06.2004 19:09

Второй метод, вот что получилось:
Код:

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.

После запуска вводишь коэффициенты и первое значение x. Потом программа начинает увеличивать (или уменьшать) x на dx (в начале = 1) до тех пор пока функции не начнут расходиться - тогда прога менят направление dx и уменьшает его. Сей процесс продолжается до тех пор, пока разница между функциями не будет меньше какого-то маленького числа e. Прогу не тестил, но, кажись, сработать должно...

Третий метод, как я понял, фактически состоит в решении уравнения

ax^3 + (b-a)x^2 + (c-b)x + (d-c) = 0

а я, хучь убей, не помню ни методов решения кубических уравнений в общем виде. :(

CaptainFlint 14.06.2004 21:14

Кубические весьма хреново решаются, надо сказать... :( Общая идея такова.
Пусть есть уравнение 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 в тригонометрический вид, считаем кубический корень и получаем наши "зеты", все три сразу.

petr()ff 17.06.2004 10:17

CaptainFlint и Ghost, еслиб не ваша помощь, подписывал бы щас обходной в институте, огромное спасибо за заботу и содействие! :yees:


Часовой пояс GMT +4, время: 02:22.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.