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

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

Форум «Всё о Паскале» _ Задачи _ Вычислить матрицу на Tp7

Автор: warhel 3.12.2006 22:52

Есть задача:
вычислить матрицу вида: C=A3+B3
3 - это степень, степень размер матрицы и т.д. естественно вводит пользователь
вообщем нужно решить всё это на турбо паскале..
я ещё не очень хорошо в нём разбираюсь но вот что всё таки сделал сам:
(работает не правельно, выводит вообще числа и не близкие к ответу)

Код
program matrix;
uses crt;
const
max=10;
var
i,j,amax, bmax,n: integer;
a,b: array [1..max,1..max] of integer;
c: array [1..max,1..max] of real;
begin
writeln('vvedite kol-vo strok v matrice: ');
readln(amax);
writeln('vvedite kol-vo stolbcov v matrice: ');
readln(bmax);
write('vvedite stepen: ');
readln(n);
writeln('vvod matrici A');
for i:=1 to amax do
  for j:=1 to bmax do
   begin
    write('vvedite ',i,'-й элемент ',j,'-строки: ');
    readln(a[i,j]);
   end;
{end for}
writeln('vvod matrici B');
for i:=1 to amax do
  for j:=1 to bmax do
   begin
    write('vvedite ',i,'-й элемент ',j,'-строки: ');
    readln(b[i,j]);
   end;
{end for}
for i:=1 to amax do
  for j:=1 to bmax do
   begin
    c[i,j]:=exp(n*(a[i,j])+exp(n*(b[i,j])) );
   end;
{end fir}
for i:=1 to amax do
  for j:=1 to bmax do
   writeln(c[i,j]);
repeat until keypressed;
end.


Помогите пожалуста smile.gif
спасибо заранее =)

Автор: klem4 3.12.2006 23:46

ну во первых ты судя по всему матрицу не правильно заполняешь,

for i:=1 to amax do
for j:=1 to bmax do
begin
write('vvedite ',i,'-й элемент ',j,'-строки: '); // <------- i - это строка, а j - столбец, а ты видимо наоборот вводишь
readln(a[i,j]);
end;

Автор: warhel 4.12.2006 0:03

ну это я пробывал менять местами вообщем смысла не меняет, я постоянно пробую вводить в А и в В одинаковые квадратные матрицы 2х2 и все элементы тоже 2. В результате программа выдаёт матрицу: 2;4;2;2, а должна 16;16;16;16..

Автор: volvo 4.12.2006 0:05

c[i,j]:=exp(n*LN(a[i,j]))+exp(n*LN(b[i,j]));
?

Автор: warhel 4.12.2006 0:16

volvo, ну как я думал эта строчка должна была возводить элемент матрицы А в степень и прибавлять к нему возведённый в степень элемент матрицы В или я не прав? исправь меня тогда пожалуйста =))

Автор: volvo 4.12.2006 0:32

Ты внимательно посмотри, на то, что было у тебя, и на то, что сделал я ...

Особенно внимание - на скобки... Ну, и про Ln не забудь...

Автор: warhel 4.12.2006 0:39

а извини плз, я подумал что ты просто выделил мою строчку кода и написал вопрос а ты на самом деле написал исправленую =) спасиб пойду пробывать

====

попробывал, всё работает огромное спасибо =)
теперь остался один вопрос только, можно ли как то реализовать тоже самое вычисление но например если матрицы будут не квадратный а скажем одна 2х3 а вторая 3х4.. я неособо в математике силён поэтому честно говоря на бумаге то не уверен что посчитаю =) очень хотел бы узнать сам метод приблезительно..


Автор: мисс_граффити 4.12.2006 1:00

а разве возведение матрицы в степень - это возведение в степень ее элементов?...

Автор: volvo 4.12.2006 1:31

Цитата
а разве возведение матрицы в степень - это возведение в степень ее элементов?...
smile.gif "That, detective, is the right question" © I, Robot

С этого и надо было начинать, warhel...
Здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=2694&view=findpost&p=38417
есть возведение матрицы (только квадратной, потому что перемножать можно только "сцепленные" матрицы, а матрица может быть сцеплена сама с собой только если она - квадратная) в степень...

Автор: warhel 4.12.2006 1:46

неет матрицу в степень мне возводить не надо =) это я и сам бы разобрался как её возвести =)
мне надо было вычилисть матрицу С каждый элемент которой равен элемнт матрицы А в степени + элемент матрицы В в степени =) впрочем с этим я разобрался, проехали =)
теперь только один вопрос можно ли перемножать не квадратные матрицы?.. или перемножать можно только сцепленные матрицы?

п.с. спасибо за ссылку нашёл некоторые полезные вещи =)

Автор: мисс_граффити 4.12.2006 1:58

так ты определись, надо ли тебе перемножать матрицы или работать с отдельными элементами?

Автор: warhel 4.12.2006 2:14

я плохо наверное обьясняю сори =)
вот значит ещё раз =)
задача:
вычислисть матрицу: An+Bn=C, где n - степень
ну т.е. каждый элемент матрицы С явл. суммой соответствующий элементов матриц А и В в указаной степени.
я решил задачу для квадратных матриц. Теперь только один вопрос, можно ли решить задачу если матрицы будут НЕ квадратные и НЕ сцеплённые? smile.gif

Автор: Archon 4.12.2006 2:30

мисс_граффити и volvo указали тебе на то, что в математике возведение матрицы в степень - это НЕ возведение в степень её элементов. Реши, что тебе надо.

Автор: warhel 4.12.2006 2:39

Archon, я ж пишу, в степень конкретно матрицу возводить мне не надо. Необходимо только её элементы smile.gif

Автор: Archon 4.12.2006 2:50

Цитата
можно ли решить задачу если матрицы будут НЕ квадратные и НЕ сцеплённые?
нет

Автор: warhel 6.12.2006 15:35

Вот ещё один вопрос возник.. а как быть если степень отрицательная?
напомню задачу:
определить матрницу С=А3+В3, где 3 - это степень..
я делал так, чтобы вычислять задачу при отрицательной степени:
сделал проверку, если стпень, которую ввёл юзер отрицательна, значит берём модуль и ставим логическую переменную, при выводе ответа опять проверка, если переменная тру, тогда пишем 1/ответ, но почему считает не правельно.. подскажите пожалуйсто.. ну и если ещё какие то недочёты уваидите тоже буду рад =)
вот конечный вариант алгоритма:

Код
program matrix;
uses crt;
const
max=10;
var
i,j,amax, bmax,n: integer;
a,b: array [1..max,1..max] of real;
c: array [1..max,1..max] of real;
flag: boolean;
t: real;
begin
clrscr;
writeln('Будьте внимательны, количество строк и стобцов должно быть больше 0 и меньше ',max);
repeat
  writeln('Введите количество строк в матрице: ');
  readln(amax);
  writeln('Введите количество столбцов в матрице: ');
  readln(bmax);
  if (amax<0) or (amax>max) or (bmax<0) or (bmax>max) then
   writeln('Внимание Вы ввели недопустимо значение, повторите.');
until (amax>0) and (amax<max) and (bmax>0) and (bmax<max);
write('Введите степень: ');
readln(n);
if n<0 then
  begin
   n:=abs(n);
   flag:=true;
  end;
writeln('Ввод матрицы A:');
for i:=1 to amax do
  for j:=1 to bmax do
   begin
    write('Введите ',i,'-й элемент ',j,'-строки: ');
    readln(a[i,j]);
   end;
{end for}
writeln('Ввод матрицы B:');
for i:=1 to amax do
  for j:=1 to bmax do
   begin
    write('Введите ',i,'-й элемент ',j,'-строки: ');
    readln(b[i,j]);
   end;
{end for}
for i:=1 to amax do
  for j:=1 to bmax do
   begin
    c[i,j]:=exp(n*LN(a[i,j]))+exp(n*LN(b[i,j]));
   end;
{end for}
if flag then
  begin
   for i:=1 to amax do
    for j:=1 to bmax do
     t:=1/c[i,j];
     writeln(t);
  end
else
  begin
   for i:=1 to amax do
    for j:=1 to bmax do
     writeln(c[i,j]:3:3);
  end;
repeat until keypressed;
end.

Автор: volvo 6.12.2006 16:10

Цитата
Вот ещё один вопрос возник.. а как быть если степень отрицательная?
Насколько я помню, в математике для квадратной матрицы определена только операция возведения в целую НЕотрицательную степень...

Автор: volvo 6.12.2006 16:20

А ошибка у тебя - в том, что ты СНАЧАЛА складываешь значения, а потом делишь на результат единицу... Тебе же надо складывать обратные значения...

Пример:
пусть определенный элемент матрицы А[1, 1] = 2, и соответственно, элемент B[1, 1] = 3... Что делает твоя программа при возведении в (-3) степень?

C[1, 1] := (2^3) + (3^3) = 35, после чего получаем 1/35

а нужно:
C[1, 1] := 1 / (2^3) + 1/(3^3) = 1/8 + 1/27 = 35/216... Согласись, что это не одно и то же...

Автор: warhel 6.12.2006 16:48

оо спасиба =) точно, а я сидел голову ломал откуда такие цифры берутся, всё супер спасибо =)