Помощь - Поиск - Пользователи - Календарь
Полная версия: С++ & Pascal > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
InFuz
Вот и начался новый мучебный год, всем привет!

Дано: 2 похожие задачки, мне все равно на чем их писать на С++ или Паскале, хотя с Паскалем я знаком дольше чем с С++.
  • 1. Найти сумму, разность, скалярное произведение и квадрат евклидовой нормы двух векторов в n-мерном пространстве.
  • 2. Проверить два вектора в n-мерном пространстве на перпендикулярность и коллинеарность.
Проблема: не знаю как эти задачи так то решить не точно запрограммировать их rolleyes.gif (по этой же причине нет пока своих наработок т.к. не знаю даже с чего начать blush.gif )
Евгений М.
Цитата
не знаю даже с чего начать

Почитать литературу.
InFuz
Поделитесь хотя бы ссылкой а то гугл всякую фигню выдает.
Harch
гм, прогать умею отлично, но раз ты не можешь сделать их просто, то помогу сделать сначала математически:

евклидова норма это корень из суммы квадратов координат вектора.
скалярное произведение в евклидовом пространстве думаю у тебя происходит покоординатно (то есть x1y1 + x2y2 + ... + xNyN)

если скалярное произведение = 0, то вектора перпендикулярны.

Если координаты векторов пропорциональны с одним коэффициэнтом (т.е. существует K, такое что y1 = k * y2 и x1 = k * x2 и т. д.), то вектора коллинеарны.

все, запрогать думаю сможешь сам
Евгений М.
Я думал Вам преподы уже давали.
Подбельский. Язык Си++
InFuz
Цитата
Я думал Вам преподы уже давали.
Подбельский. Язык Си++

не не я про математическую часть задачи smile.gif
Harch
а я разве ее не объяснил?
Vahappaday
При проверке на коллинеарность сразу проверяй, нет ли нулевых координат, потому что вероятнее всего будет использоваться деление.
InFuz
Harch спасибо за "пищу для ума"
Harch
то есть ты не понял? объяснить подробнее?
P.S. по мне куда уж подробнее smile.gif
InFuz
понял, еще воплощать не пробовал, щас другое пишу, но вроде пока понятно, если чо потом буду отдельно спрашивать
Harch
Хорошо. Пояснения по синтаксису и написанию программ есть? (я знаю только C/C++/Java/C#/PHP/JavaScript/HTML/DirectX/OpenGL)
InFuz
С программной частью вроде проблем нет.
Harch
Хорошо.
InFuz
Для 2 программы вот так получилось

Код
void main()
    {
      clrscr();
      int x1,y1,x2,y2,sp,xmin,xmax,ymin,ymax;
      float kx,ky;
      cout<<"x1= "; cin>>x1;
      cout<<"y1= "; cin>>y1;
      cout<<"x2= "; cin>>x2;
      cout<<"y2= "; cin>>y2;
      sp=x1*y1+x2*y2;
      if(sp==0) cout<<"Vektora perpend.";
      else cout<<"Vertora ne perpend.";
      cout<<"\n";
      if(x1>=x2) {xmax=x1; xmin=x2;}
      else {xmax=x2; xmin=x1;}
      if(y1>=y2) {ymax=y1; ymin=y2;}
      else {ymax=y2; ymin=y1;}
      if(xmin!=0) kx=xmax/xmin;
      if(ymin!=0) ky=ymax/ymin;
      if(kx==ky) cout<<"Vektora kollinearnbl";
      else cout<<"Vektora ne kollinearnbl";
      getch();
    }
Vahappaday
это не n-мерное пространство, а 2-мерное
InFuz
Цитата(Vahappaday @ 3.10.2010, 15:24) *

это не n-мерное пространство, а 2-мерное

я спросил у препода, он сказал можно как частный случай взять 2 мерное, так что это не принципиально.
Евгений М.
У меня сомнения, что вектора (1;2) и (2;5) коллинеарны. Вообще Вы используете целочисленное деление (т.е. дробные части откидываются).
Используйте это равенство:
x1*y2-x2*y1=0
Если равенство выполняется то вектора коллинеарны.
InFuz
все заменил.
InFuz
а квадрат евклидовой нормы это будет e=x1^2+y1^2+x2^2+y2^2 ?
tig81
Цитата(InFuz @ 3.10.2010, 15:08) *

а квадрат евклидовой нормы это будет e=x1^2+y1^2+x2^2+y2^2 ?

Откуда такая формула?
InFuz
евклидова норма это корень из суммы квадратов координат вектора.
я не совсем понял вот и спрашиваю.
Vahappaday
e = (x2-x1)^2 + (y2-y1)^2 - это уже квадрат нормы
InFuz
1 вот так получилась

Цитата
program vekt;
uses crt;
var x1,x2,y1,y2,xb,yb,sp:integer; en:real;
BEGIN
clrscr;

write('x1= '); readln(x1);
write('y1= '); readln(y1);
write('x2= '); readln(x2);
write('y2= '); readln(y2);

xb:=x1+x2;
yb:=y1+y2;
writeln('A(x1,y1)+B(x2,y2)= (',xb,',',yb,')');
xb:=x1-x2;
yb:=y1-y2;
writeln('A(x1,y1)-B(x2,y2)= (',xb,',',yb,')');
sp:=x1*y1+x2*y2;
writeln('A*B=',sp);
en:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
writeln('Evk. norm.= ',en);

readkey
END.
Vahappaday
То что я написал - это норма разности двух векторов.
Немножко перепутал норму и метрику.
норма вычисляется относительного одного вектора
Для первого: sqrt(x1^2+y1^2)
Для второго: sqrt(x2^2+y2^2)

По первой более нет замечаний.
tig81
Цитата(Vahappaday @ 3.10.2010, 16:18) *

e = (x2-x1)^2 + (y2-y1)^2 - это уже квадрат нормы

Квадрат нормы чего?


Цитата(Vahappaday @ 3.10.2010, 16:45) *

То что я написал - это норма разности двух векторов.

А...
InFuz
ясно
InFuz
Цитата(Евгений М. @ 3.10.2010, 15:32) *

У меня сомнения, что вектора (1;2) и (2;5) коллинеарны. Вообще Вы используете целочисленное деление (т.е. дробные части откидываются).
Используйте это равенство:
x1*y2-x2*y1=0
Если равенство выполняется то вектора коллинеарны.


а для n мерного пространства какая будет формула?
Vahappaday
для n-мерного пространства будет n-1 формула
(x1)1*(x2)2 - (x1)2*(x2)1=0
(x2)1*(x3)2 - (x2)2*(x3)1=0
....
(x(n-1))1*(xn)2 - (x(n-1))2*(xn)1=0,
где
(xi)j - i-я координата j-го вектора
InFuz
Vahappaday чот не въеду не как в то что вы написали.
вот у меня такая штука получилась, я создал массив kmas который хранит коэффициенты k для каждой пары x1,x2; y1,y2 и т.д. но все равно не фига не работает выдает что (1,2) кол-ен (2,5)

Код
//-----------------------------------------------------------------
    void main()
    {
      clrscr();
      int i,sp1=1,sp2=1,n,f=0;
      cout<<"n="; cin>>n;
      int* vek1 = new int[n];
      int* vek2 = new int[n];
      double* kmas = new double[n];
//------------------------------------------------------------------
      cout<<"zadaite 1 vektor"<<"\n";
      for (i=0; i<n; i++)
      {
    cin>>vek1[i];
      }
      cout<<"zadaite 2 vektor"<<"\n";
      for (i=0; i<n; i++)
      {
    cin>>vek2[i];
      }
//------------------------------------------------------------------
      for (i=0; i<n; i++)
      {
    sp1=sp1*vek1[i];
    sp2=sp2*vek2[i];
    if(vek2[i]!=0)kmas[i]=(double)vek1[i]/vek2[i];
      }
      sp2=sp1+sp2;
      if(sp2==0) cout<<"vektora perp. \n";
      else cout<<"vektora ne perp. \n";
      for (i=0; i<n-1; i++)
      {
    if(kmas[i]==kmas[i+1]) f=1;
    else {f=0; break;}
      }
      if(f=1) cout<<"vektora kol.";
      else cout<<"vektora ne kol.";
       for (i=0; i<n; i++)
      {
    cout<<"\n kmas["<<i<<"]="<<kmas[i];
      }

      delete []vek1;
      delete []vek2;
      delete []kmas;
      getch();
    }
Vahappaday
if(f==1) cout<<"vektora kol.";
Косячить будет ещё и в случае, когда один из векторов имеет нулевую координату.
Так что рекомендую всё же обратиться к тем формулам, что я написал.

Да и проверка на перпендикулярность не корректна:
например, на вектора (2; 2), (1; -1) ваша программа говорит, что они не перпендикулярны, хотя они как раз таковыми являются.
Перемножать надо не все координаты одного вектора между собой.
Надо сделать сумму произведений соответствующих координат векторов.

InFuz
Цитата(Vahappaday @ 9.10.2010, 19:42) *

Да и проверка на перпендикулярность не корректна:
например, на вектора (2; 2), (1; -1) ваша программа говорит, что они не перпендикулярны, хотя они как раз таковыми являются.
Перемножать надо не все координаты одного вектора между собой.
Надо сделать сумму произведений соответствующих координат векторов.


как же 2,2 и 1,-1 преп. если 2*2 не равно 1*(-1)? если скалярное произведение = 0, то вектора перпендикулярны.

помогите формулы внедрить а то чот я в них ни как не разбирусь например (xi)j - i-я координата j-го вектора у нас только 2 вектора нам не нужно j.
Vahappaday
Насчёт (2;2) и (1; -1) - нарисуйте на бумажке, будет сразу видно, что они перпендикулярны.
И скалярное произведение у них будет такое:
2*1 + 2*(-1) = 2-2=0

Насчёт коллинеарности, я бы проверял так:
f=1;
for (i=0; i<n-1; i++)
{
if(vek1[i]*vek2[i+1] - vek1[i+1]*vek2[i])
{
f=0;
break;
}
}
А дальше уж Ваша проверка.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.