Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Суперпозиция многочленов

Автор: Camel_Toe 18.10.2003 15:57

короче, задача такая. Даны два многочлена f(x) и g(x). Требуется найти их суперпозицию, то есть f(g(x)). Данные о каждом многочлене представлены в соотв.файлах в формате: коээфициент, степень. Если у кого есть какие мысли как это можно реализовать на паскале, просьба поделиться со мной, а то у меня лично никаких идей нет.

Автор: ___ALex___ 18.10.2003 16:49

что уж тут сложного-то?что именно-то непонятно?
считываешь из файла данные потом считаешь...

Автор: ___ALex___ 18.10.2003 17:20

это универская задача?
приведи её точную формулировку

Автор: Camel_Toe 18.10.2003 18:15

В принципе формулировка уже была приведена. Даны два многочлена: f(x) И g(x). Их значения находятся в 2 внешних файлах. Каждый файл организован по принципу: каждая нова строчка содержит два числа: первое число - это коэффициент, а второе число - степень, при которой и стоит этот самый коэффициент. Требуется найти суперпозицию этих многочленов, то есть f(g(x)). А как ее найти я не очень то и понял. Подскажите хотя бы алгоритм, а лучше кодом =)))).
Например, если f(x)=х^2+4, а многочлен g(x)=x^3+2x+4. То на экран (или в файл по описанному выше принципу) должно быть выведено: f(x^3+2x+4)=(x^3+2x+4)^2 +4, ну в смысле не так как я щас написал, а уже подсчитано, то есть с раскрыванием скобок и приведением подобных.
2____Alex_____: если ты такой мастер, то почему не поможешь ????? или задача не такая легкая smile.gif????

Автор: ___ALex___ 18.10.2003 19:06

мастер тут не причём, просто не вижу сложностей...
скажи, данные как я понимаю в файлах храняться в текстовом виде?
и тип коэффициентов полиномов какой?

Автор: Camel_Toe 18.10.2003 23:05

коэффициенты и степени типа integer. все хранится в файле, формат текстовый.

Автор: ___ALex___ 18.10.2003 23:13

если всё хранится в текстовом файле, это не значит что это "всё" лежит там в текстовом формате, ну да ладно
мысли-то никаки тебя не посетили дельные насчёт задачи?

Автор: Camel_Toe 19.10.2003 20:35

неа, хотя была мысль написать функцию умножения двух многочленов, но потом она отпала, тк я не понял как ее можно связать на паскале с моей задачей.
ЗЫ: кстати, помойму задачка сложная, раз никто не смог ее решить.............=)))))))), хотя жаль, мне ее скоро сдавать=))))))))))))))))))))))

Автор: ___ALex___ 19.10.2003 20:47

сегодня(или завтра) напишу
PS просьба другим её не делать, чтоб я зря не писал

Автор: ___ALex___ 19.10.2003 23:58

program Polinoms;
{ обработки возможных ошибок в проге нет, пиши сам если нужно,
  как видно, прога написана таким образом, что её очень просто
  обобщить на любое число полиномов }
uses Crt;
const
 n = 2;
 MasFileNames: Array[1..n] of String = ('g.txt', 'f.txt');
var
 i: Byte;
 MasF: Array[1..n] of Text;
 S: String;
 V, ErrCode: Integer;
 R, x, Buf: Extended;
 { x > 0, если хочешь, чтобы работало и при x <= 0,
   то соответствующим образом измени код }
Begin

 ClrScr;
 Write('Введите x (x > 0): ');
 ReadLn®;
 for i := 1 to n do begin
  { подразумевается что данные в файлах хранятся в формате: строка степени,
    строка коэффициента для удобства обработки, а то бы пришлось "разбирать"
    строку на составляющие }
  Assign(MasF[i], MasFileNames[i]);
  Reset(MasF[i]);
  x := R;
  R := 0;
  while not Eof(MasF[i]) do begin
   ReadLn(MasF[i], S); { читаем степень }
   Val(S, V, ErrCode);
   Buf := Exp(V * Ln(x));
   ReadLn(MasF[i], S); { читаем коэффициент }
   Val(S, V, ErrCode);
   R := R + V * Buf;
  end;
  Close(MasF[i]);
 end;
 WriteLn('Суперпозиция равна ', R:0:5);
 repeat until KeyPressed

End.

Автор: Camel_Toe 20.10.2003 11:53

спасибо за код, сёдня попробую пропустить на паскале, вечерком отпишусь.
ЗЫ: smile.gif сенкс smile.gif

Автор: zx1024 20.10.2003 20:07

А разве это было нужно?

Автор: Camel_Toe 20.10.2003 21:09

2 zx1024: ты про что ???

Автор: zx1024 20.10.2003 23:36

Считать значение суперпозиции при некотором x.
Судя по
#3 18.10.2003 в 17:15:12
нужно найти многочлен - результат транспозиции, а не его значение.
Есть ещё вариант, что я тормознул, но его мы рассматривать, пожалуй, не будем.

Автор: ___ALex___ 20.10.2003 23:53

скорее второй вариант

Автор: Camel_Toe 21.10.2003 8:06

да нет, ты не тормознул, надо найти как раз не значение суперпозиции, а саму суперпозицию. это между прочим у нас "обычной" лабораторной работой назывется. Вот так!!!
ЗЫ: кста, код программы работает, тока маленька не так как надо.....=))))

Автор: ___ALex___ 21.10.2003 12:02

Camel_Toe
дальше ты уж как-нить сам

Автор: zx1024 21.10.2003 14:39

Camel_Toe.
А, чем тебе не понравилась процедура умножения многочленов.
Через неё напишешь возведение в степень.
+ Сложение.
И всё готово.

Автор: Camel_Toe 21.10.2003 18:12

2 zx1024: не все так просто, как кажется. вот ты сам попробуй написать такую прогу, которая считает суперпозицию многочленов, и поймешь что там очень много мелких ньюансов, кторые сильно портят жизнь, точнее ее усложняют=))))))))))))).
ЗЫ: неужели среди участников форума все о паскале нет программистов, готовых протянуть руку помощи будущему программисту ??? Я удивлен. Тем более, я смотрел все темы ниже моей, так там такие ламерские задачи, типа максимального элемента матрицы. Получается, что легкие задачи никто не решает, а как попадается сложная задача так все попрятались. Жаль !

Автор: zx1024 21.10.2003 18:42

Что именно вызывает проблемы:
1) Сложение многочленов (здесь же и приведение подобных),
2) Умножение многочленов (сложение уже есть),
3) Возведение многочлена в степень (при условии, что умножение и сложение уже есть)?
Рассмотри эти вопросы по отдельности (ведь о скорости выполнения тебя спрашивать никто не будет) и проблем вообще никаких не будет, - просто вызывай соответствубщие проц-ы.
Представляй многочлен как массив. A[i] = q - при степени = i - коэффициент - q.
Если данные (многочлены) представлять сложно, - то и все становится сложным.

Автор: Camel_Toe 21.10.2003 21:30

а тыб мог кодом кинутся, а так у меня самого догадки  есть, но никак ни получается, там в самой программе у меня не получается полностью просчитать все варианты, ну это так на словах не объяснить............................................

Автор: zx1024 22.10.2003 10:08

Чтение мн-нов из файла.


type
 TMnog : array [0..100] of real;
var f, g : TMnog;
...
procedure Read_from_file (file_name : string; var Mnog : TMnog);
var file_p : text;
 s : string;
 Er : integer;
 i : integer;
 k : real;
begin
 for i := 0 to 100 do
   Mnog[i] := 0;
 assign (file_p, file_name);
 reset (file_p);
 repeat
   readln (file_p, s);
   val (s, i, Er);
   readln (file_p, s);
   val (s, k, Er);
   Mnog[i] := Mnog[i] + k;
 until eof(file_p);
 close (file_p)
end;


В программе соотв-но

...
read_from_file ('f.txt', f);
read_from_file ('g.txt', g);
...


Без проверки ошибок.
Дела улажу и напишу всё остальное.

Автор: zx1024 22.10.2003 10:51

Сложение


procedure Add_Mnog (x, y : TMnog; var z : TMnog);
var i : integer;
begin
 for i := 0 to 100 do
   z[i] := x[i] + y[i]
end;


Не правда ли, просто.

Автор: zx1024 22.10.2003 11:54

Умножение


procedure Mul_Mnog (x, y : TMnog; var z : TMnog);
var i, j : integer;
begin
 for i := 0 to 100 do
   z[i] := 0;
 for i := 0 to 100 do
   for j := 0 to 100 - i do
     z[i+j] := z[i+j] + x[i] * y[j]
end;


Прошу заметить, что при умножении степени результата, большие 100, отбрасываются. Если надо, для произвольных степеней (там будет и оптимизация/скорость лучше) пиши сам. Я только предлагаю идею.
Кстати. Пока нет ничего сложного.

Автор: zx1024 22.10.2003 12:06

Ещё более элементарное возведение в степень.


procedure Power_Mnog (x : TMnog; power : byte; var z : TMnog);
var A, t : TMnog;
 i : integer;
begin
 for i := 1 to 100 do
   t[i] := 0;
 t[0] := 1;
 if power = 0 then
   A := t
 else
   A := x;
 while power > 1 do
 begin
   if (power and 1) = 1 then
     Mul_Mnog (A, t, t);
   Mul_Mnog (A, A, A);
   power := power shr 1
 end;
 Mul_Mnog (A, t, z)
end;


Добавь ещё умножение мног-на на число. Понадобится при суперпозиции.
Теперь всё соединяешь и считаешь, используя уже написанные проц-ры. Кстати, что-то может неправильно работать - сам не проверяю, пишу прямо сюда.
Как видишь - ничего сложного.

Автор: Camel_Toe 23.10.2003 21:50

так то оно так, что ничего сложного на словах, а на деле бывают затыки, но все равно zx1024 спасибо за помощь и ответы на мои вопросы.

Автор: kisin 11.07.2007 6:58

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

кусок по сложению, что был приведен выше:


procedure Add_Mnog (x, y : TMnog; var z : TMnog);
var i : integer;
begin
for i := 0 to 100 do
z[i] := x[i] + y[i]
end;

  1. что должно быть сообщено этой функции?
  2. в каком виде представлять и обрабатывать данные, вводимые с клавиатуры (к примеру: x^3+4*x+5).
объясните с самого начала, если не сложно..

Автор: volvo 11.07.2007 13:55

Цитата
объясните с самого начала, если не сложно..

А может быть ты перечитаешь всю тему с начала? Ясно же написано, что такое TMnog, да и сложение с умножением тоже реализовано... А заглянул бы в поиск - нашел бы еще один (как минимум) вариант обработки многочленов...