المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


آموزش:الگوریتم:ضرب داخلی و خارجی

ضرب داخلی و خارجی

هر عدد مختلط مانند a در صفحه را می‌توان برداری در نظر گرفت که ابتدای آن عدد 0 و انتهای آن a می‌باشد.با این تعریف از اعداد مختلط می‌توان همانند بردارها برای اعداد مختلط ضرب داخلی و خارجی تعریف کرد. در صورت که فرم مثلثاتی اعداد مختلط را در نظر بگیریم، مقدار ضربی داخلی دو عدد مختلط برابر حاصل ضرب کسینوس زاویه بین دو عدد در حاصل ضرب طول بردار ها. حاصل ضرب طول اعداد برابر نرم حاصل ضرب آن‌ها و کسینوس زاویه بین اعداد برابر قسمت حقیقی آرگومان عدد حاصل از تقسیم دو عدد می‌باشد.

ضرب داخلی

درصورتی که بردار یکه در راستای محور i را u بگیریم خواهیم داشت :

$${u} = \frac{{b}}{\|{b}\|}$$

و برای محاسبه تصویر برداری مانند a بر روی بردار یکه u می‌توانیم از رابطه زیر استفاده کنیم:

\begin{gather}{a} \cdot {u} = \|{a}\| \cos \theta, \label{dot_product_unit} \end{gather}

درواقع با توجه به این رابطه ضرب داخلی دوبردار $u=r(Cos(\theta)+i Sin(\theta))$و $v=r^{'}(Cos(\theta^{'})+iSin(\theta^{'}))$برابر است با : $$ u.v=r.r^{'}Cos(\theta-\theta^{'})$$

که با توجه به رابطه زیر:

$$Cos(\theta-\theta^{'})=Sin(\theta)Sin(\theta^{'})+Cos(\theta)Cos(\theta^{'})$$

خواهیم داشت : $$u.v=rr^{'}Sin(\theta).Sin(\theta^{'})+rr^{'}Cos(\theta)Cos(\theta^{'})$$

بنابراین اگر دوبردار مانند $u=x+yi$ و $v=x^{'}+y^{'}i$ داشته باشیم ضرب داخلی آن‌ها به صورت زیر خواهد بود :

$$uv=xx^{'}+yy^{'}i$$

هم چنین ضرب داخلی $v$ و $u$ را می‌توان به فرم زیر نیز نوشت :

$$u.v=Re(\frac{u}{v}).||v||^{2}$$

تعبیر ماتریسی ضرب داخلی :

\begin{align*} {x}^T {y} = \left[ \begin{array}{ccccc} x_1& x_2& x_3& \cdots& x_n \end{array} \right] \left[ \begin{array}{c} y_1\\ y_2\\ y_3\\ \vdots\\ y_n \end{array} \right] =x_1y_1+x_2y_2+x_3y_3 + \ldots + x_ny_n = {x} \cdot {y} \end{align*}

ضرب خارجی

در ریاضیات، ضرب خارجی عملی دوتایی بر دو بردار در فضای سه بعدی اقلیدسی است که نتیجه آن برداری است که بر دو بردار اولیه عمود است. در مقابل، ضرب داخلی یک اسکالر را نتیجه می‌دهد. در بسیاری از کاربردهای فیزیکی و مهندسی نیاز به یافتن برداری عمود بر دو بردار می‌باشد که می‌توان در این موارد از حاصلضرب خارجی استفاده کرد.

برای یافتن جهت بردار حاصلضرب خارجی دو بردار. حاصلضرب خارجی دو بردار a و b با a × b نمایش داده می‌شود. در فضای اقلیدسی سه‌بعدی در دستگاه مختصات راست‌گرد، حاصلضرب خارجی دو بردار، برداری است مانند c که بر دو بردار a و b عمود است و جهت آن با استفاده از قانون دست راست تعیین می‌گردد و اندازه آن برابر است با مساحت متوازی‌الاضلاعی که این دو بردار دو ضلع مجاور آن را تشکیل می‌دهند. یعنی: $$a\times b=ab sin(\theta) \hat{n}$$ که θ زاویه بین دو بردار a و a ، b و b اندازه این دو بردار و $n$ بردار یکه در راستای عمود بر دو بردار a و b و در جهت تعیین شده توسط قانون دست راست است.

همچنین برای تعیین نتیجه یک ضرب خارجی بدون استفاده از زاویه بین دو بردار و یا در صورت نداشتن زاویه بین دو بردار, ماتریسی n*n نوشته و گزاره های ماتریس را محاسبه میکنیم. سوالات معمولا در فضای 3 بعدی بررسی می شوند, بنابراین ماتریسی 3*3 نوشته و i , j , k را در سطر اول, مقادیر بردار اول را در سطر دوم و مقادیر بردار دوم را در سطر سوم ماتریس می نویسیم. نتیجه محاسبه برای دو بردار ( ai,bj,ck ) و ( di,ej,fk ) به صورت زیر خواهد بود : bf-ce) i , (cd-af) j , (ae-bd) k)

الگوریتم

پیاده‌سازی اولیه ضرب داخلی

A.c
#include <iostream>
#include <vector>
 
using namespace std;
 
class Scalar_product
{
    public:
    Scalar_product(vector<double> a, vector<double> b);
};
double scalar_product(vector<double> a, vector<double> b)
{
    double product = 0;
    for (int i = 0; i <= a.size()-1; i++)
        for (int i = 0; i <= b.size()-1; i++)
            product = product + (a[i])*(b[i]);
    return product;
}

پیاده‌سازی اولیه ضرب خارجی

‌‌B.c
#include <iostream>
 
template< class T >
class D3Vector {
 
template< class U >
friend std::ostream & operator<<( std::ostream & , const D3Vector<U> & ) ;   
 
public :
   D3Vector( T a , T b , T c ) {
      x = a ;
      y = b ;
      z = c ;
   }
 
   T dotproduct ( const D3Vector & rhs ) {
      T scalar = x * rhs.x + y * rhs.y + z * rhs.z ;
      return scalar ;
   }
 
   D3Vector crossproduct ( const D3Vector & rhs ) {
      T a = y * rhs.z - z * rhs.y ;
      T b = z * rhs.x - x * rhs.z ;
      T c = x * rhs.y - y * rhs.x ;
      D3Vector product( a , b , c ) ;
      return product ;
   }
 
   D3Vector triplevec( D3Vector & a , D3Vector & b ) {
      return crossproduct ( a.crossproduct( b ) ) ;
   }
 
   T triplescal( D3Vector & a, D3Vector & b ) {
      return dotproduct( a.crossproduct( b ) ) ;
   }
 
private :
   T x , y , z ;  
} ;
 
template< class T >
std::ostream & operator<< ( std::ostream & os , const D3Vector<T> & vec ) {
   os << "( "  << vec.x << " ,  " << vec.y << " ,  " << vec.z << " )" ;
   return os ;
}
 
int main( ) {
//یک مثال ساده :   
   D3Vector<int> a( 3 , 4 , 5 ) , b ( 4 , 3 , 5 ) , c( -5 , -12 , -13 ) ;
   std::cout << "a . b : " << a.dotproduct( b ) << "\n" ;
   std::cout << "a x b : " << a.crossproduct( b ) << "\n" ;
   std::cout << "a . b x c : " << a.triplescal( b , c ) << "\n" ;
   std::cout << "a x b x c : " << a.triplevec( b , c ) << "\n" ;
   return 0 ;
}

منابع

- پیاده سازی اولیه


- ضرب خارجی


- ضرب داخلی


خواننده‌ی گرامی، لطفا در صورت داشتن پیشنهاد یا مشاهده‌ی مشکل (علمی، تایپی و …) در این صفحه، به ما اطلاع دهید:

نظرات

نظر خود را وارد کنید. دستورات ویکی مجاز است:
‎ 16 +12 = ? ‎
 

ابزار صفحه