InFuz
Сообщение
#62004 29.9.2010, 14:09
Вот и начался новый мучебный год, всем привет!
Дано: 2 похожие задачки, мне все равно на чем их писать на С++ или Паскале, хотя с Паскалем я знаком дольше чем с С++.
- 1. Найти сумму, разность, скалярное произведение и квадрат евклидовой нормы двух векторов в n-мерном пространстве.
- 2. Проверить два вектора в n-мерном пространстве на перпендикулярность и коллинеарность.
Проблема: не знаю как эти задачи так то решить не точно запрограммировать их

(по этой же причине нет пока своих наработок т.к. не знаю даже с чего начать

)
Евгений М.
Сообщение
#62005 29.9.2010, 14:22
Цитата
не знаю даже с чего начать
Почитать литературу.
InFuz
Сообщение
#62006 29.9.2010, 14:27
Поделитесь хотя бы ссылкой а то гугл всякую фигню выдает.
Harch
Сообщение
#62007 29.9.2010, 14:30
гм, прогать умею отлично, но раз ты не можешь сделать их просто, то помогу сделать сначала математически:
евклидова норма это корень из суммы квадратов координат вектора.
скалярное произведение в евклидовом пространстве думаю у тебя происходит покоординатно (то есть x1y1 + x2y2 + ... + xNyN)
если скалярное произведение = 0, то вектора перпендикулярны.
Если координаты векторов пропорциональны с одним коэффициэнтом (т.е. существует K, такое что y1 = k * y2 и x1 = k * x2 и т. д.), то вектора коллинеарны.
все, запрогать думаю сможешь сам
Евгений М.
Сообщение
#62008 29.9.2010, 14:32
Я думал Вам преподы уже давали.
Подбельский. Язык Си++
InFuz
Сообщение
#62010 29.9.2010, 14:35
Цитата
Я думал Вам преподы уже давали.
Подбельский. Язык Си++
не не я про математическую часть задачи
Harch
Сообщение
#62011 29.9.2010, 14:38
а я разве ее не объяснил?
Vahappaday
Сообщение
#62012 29.9.2010, 14:39
При проверке на коллинеарность сразу проверяй, нет ли нулевых координат, потому что вероятнее всего будет использоваться деление.
InFuz
Сообщение
#62013 29.9.2010, 14:39
Harch спасибо за "пищу для ума"
Harch
Сообщение
#62014 29.9.2010, 14:41
то есть ты не понял? объяснить подробнее?
P.S. по мне куда уж подробнее
InFuz
Сообщение
#62015 29.9.2010, 14:47
понял, еще воплощать не пробовал, щас другое пишу, но вроде пока понятно, если чо потом буду отдельно спрашивать
Harch
Сообщение
#62016 29.9.2010, 14:48
Хорошо. Пояснения по синтаксису и написанию программ есть? (я знаю только C/C++/Java/C#/PHP/JavaScript/HTML/DirectX/OpenGL)
InFuz
Сообщение
#62018 29.9.2010, 14:52
С программной частью вроде проблем нет.
Harch
Сообщение
#62019 29.9.2010, 14:58
Хорошо.
InFuz
Сообщение
#62278 3.10.2010, 11:19
Для 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
Сообщение
#62279 3.10.2010, 11:24
это не n-мерное пространство, а 2-мерное
InFuz
Сообщение
#62280 3.10.2010, 11:31
Цитата(Vahappaday @ 3.10.2010, 15:24)

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

а квадрат евклидовой нормы это будет e=x1^2+y1^2+x2^2+y2^2 ?
Откуда такая формула?
InFuz
Сообщение
#62293 3.10.2010, 13:11
евклидова норма это корень из суммы квадратов координат вектора.
я не совсем понял вот и спрашиваю.
Vahappaday
Сообщение
#62294 3.10.2010, 13:18
e = (x2-x1)^2 + (y2-y1)^2 - это уже квадрат нормы
InFuz
Сообщение
#62296 3.10.2010, 13:29
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
Сообщение
#62298 3.10.2010, 13:45
То что я написал - это норма разности двух векторов.
Немножко перепутал норму и метрику.
норма вычисляется относительного одного вектора
Для первого: sqrt(x1^2+y1^2)
Для второго: sqrt(x2^2+y2^2)
По первой более нет замечаний.
tig81
Сообщение
#62299 3.10.2010, 13:46
Цитата(Vahappaday @ 3.10.2010, 16:18)

e = (x2-x1)^2 + (y2-y1)^2 - это уже квадрат нормы
Квадрат нормы чего?
Цитата(Vahappaday @ 3.10.2010, 16:45)

То что я написал - это норма разности двух векторов.
А...
InFuz
Сообщение
#62300 3.10.2010, 13:54
ясно
InFuz
Сообщение
#62508 8.10.2010, 13:50
Цитата(Евгений М. @ 3.10.2010, 15:32)

У меня сомнения, что вектора (1;2) и (2;5) коллинеарны. Вообще Вы используете целочисленное деление (т.е. дробные части откидываются).
Используйте это равенство:
x1*y2-x2*y1=0
Если равенство выполняется то вектора коллинеарны.
а для n мерного пространства какая будет формула?
Vahappaday
Сообщение
#62512 8.10.2010, 15:41
для 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
Сообщение
#62547 9.10.2010, 12:29
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
Сообщение
#62561 9.10.2010, 15:42
if(f==1) cout<<"vektora kol.";
Косячить будет ещё и в случае, когда один из векторов имеет нулевую координату.
Так что рекомендую всё же обратиться к тем формулам, что я написал.
Да и проверка на перпендикулярность не корректна:
например, на вектора (2; 2), (1; -1) ваша программа говорит, что они не перпендикулярны, хотя они как раз таковыми являются.
Перемножать надо не все координаты одного вектора между собой.
Надо сделать сумму произведений соответствующих координат векторов.
InFuz
Сообщение
#62626 10.10.2010, 10:47
Цитата(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
Сообщение
#62628 10.10.2010, 11:25
Насчёт (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;
}
}
А дальше уж Ваша проверка.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.