کلیدستان

نسخه‌ی کامل: مشکل atan2 (در متلب - MATLAB)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
با عرض سلام، کدی که پیوست شده و کد پرتاب یک موشک است، در جایی از آن به من اخطار Error using atan2
Inputs must be real می دهد که علت آن را نمیدانم، خوشحال می شوم کسی از دوستان پاسخ دهد. بسیار متشکر
سلام.
بنده کدها را بررسی نکردم، ولی همان طور که از پیام خطا مشخص است، اخطار داده شده که باید ورودی دستور atan2 ، اعداد حقیقی (Real) باشند. 
بنابراین احتمالا ورودی دستور، یک عدد مختلط بوده که دارای بخش موهومی (Imaginary) بوده است و بنابراین دستور atan2 خطا می دهد.
در خود Help نرم افزار متلب، می توانید شکل استفاده از دستور atan2 را ببینید.
دستور imag برای به دست آوردن بخش موهومی (Imaginary) یک عدد مختلط و دستور real برای به دست آوردن بخش حقیقی (Real) یک عدد مختلط به کار می رود و می توانید از این دو دستور در متلب (MATLAB) استفاده کنید تا بخش های حقیقی (Real) و موهومی (Imaginary) اعداد مختلط را به دست آورید و سپس مطابق عملیات مورد نظر خود، از آنها استفاده نمایید (مثل دادن به ورودی دستور atan2).

Flower
(۱۳۹۷/۰۵/۱۲, ۰۶:۴۶ ب.ظ)admin نوشته: [ -> ]سلام.
بنده کدها را بررسی نکردم، ولی همان طور که از پیام خطا مشخص است، اخطار داده شده که باید ورودی دستور atan2 ، اعداد حقیقی (Real) باشند. 
بنابراین احتمالا ورودی دستور، یک عدد مختلط بوده که دارای بخش موهومی (Imaginary) بوده است و بنابراین دستور atan2 خطا می دهد.
در خود Help نرم افزار متلب، می توانید شکل استفاده از دستور atan2 را ببینید.
دستور imag برای به دست آوردن بخش موهومی (Imaginary) یک عدد مختلط و دستور real برای به دست آوردن بخش حقیقی (Real) یک عدد مختلط به کار می رود و می توانید از این دو دستور در متلب (MATLAB) استفاده کنید تا بخش های حقیقی (Real) و موهومی (Imaginary) اعداد مختلط را به دست آورید و سپس مطابق عملیات مورد نظر خود، از آنها استفاده نمایید (مثل دادن به ورودی دستور atan2).

Flower

بسیار ممنون و متشکر، با قرار دادن دستور real در درون پرانتز تانژانت این مشکل حل شد.
این اولین باره که من از کلیدستان و یک انجمن استفاده می کنم و لذت حل مشکل از طریق مطرح کردن سوال را می چشم.
خیلی سپاس گذارم و از سایت خوبتان زیاد استفاده می کنم.
خدا خیرتون بده.
(۱۳۹۷/۰۵/۱۲, ۰۶:۴۶ ب.ظ)admin نوشته: [ -> ]سلام.
بنده کدها را بررسی نکردم، ولی همان طور که از پیام خطا مشخص است، اخطار داده شده که باید ورودی دستور atan2 ، اعداد حقیقی (Real) باشند. 
بنابراین احتمالا ورودی دستور، یک عدد مختلط بوده که دارای بخش موهومی (Imaginary) بوده است و بنابراین دستور atan2 خطا می دهد.
در خود Help نرم افزار متلب، می توانید شکل استفاده از دستور atan2 را ببینید.
دستور imag برای به دست آوردن بخش موهومی (Imaginary) یک عدد مختلط و دستور real برای به دست آوردن بخش حقیقی (Real) یک عدد مختلط به کار می رود و می توانید از این دو دستور در متلب (MATLAB) استفاده کنید تا بخش های حقیقی (Real) و موهومی (Imaginary) اعداد مختلط را به دست آورید و سپس مطابق عملیات مورد نظر خود، از آنها استفاده نمایید (مثل دادن به ورودی دستور atan2).

Flower

فقط یه سوال دیگه این که چطور میشه که یه قسمت موهومی به عدد ما اضافه می شه؟
ممکنه این کد باعث ایجادش شده باشه؟ :

amdx(i+1)=(T*cosd(gamma_m(i))-L(i+1)*sind(gamma_m(i))-D(i+1)*cosd(gamma_m(i)))/m

amdy(i+1)=(L(i+1)*cosd(gamma_m(i))+T*sind(gamma_m(i))-D(i+1)*sind(gamma_m(i))-m*g)/m
(۱۳۹۷/۰۵/۱۲, ۰۸:۰۲ ب.ظ)hosein2662 نوشته: [ -> ]فقط یه سوال دیگه این که چطور میشه که یه قسمت موهومی به عدد ما اضافه می شه؟
ممکنه این کد باعث ایجادش شده باشه؟ :

amdx(i+1)=(T*cosd(gamma_m(i))-L(i+1)*sind(gamma_m(i))-D(i+1)*cosd(gamma_m(i)))/m

amdy(i+1)=(L(i+1)*cosd(gamma_m(i))+T*sind(gamma_m(i))-D(i+1)*sind(gamma_m(i))-m*g)/m

باید نتایج اجرای کدها رو مرحله به مرحله در خروجی متلب (MATLAB) چک کنید و ببینید که در کدام مرحله، نتایج به صورت عدد مختلط هستند. 
البته در حالت کلی، این موضوع خیلی مهم نیست و حذف قسمت موهومی اعداد ممکن است نتایج عملیات های ریاضی شما را اشتباه کند (بستگی به منطق ریاضی عملیات ها دارد و اینکه آیا بخش موهومی برای محاسبات مهم است یا نه و اینکه اصلا بخش موهومی باید ایجاد می شده یا نه).
توصیه می شود با راهنمایی استاد خود، حتما فرمول های ریاضی اجرا شده توسط کدها را چک کنید و همچنین عملکرد توابع (دستورات) را هم در Help متلب بخوانید و ببینید که در صورت وجود بخش موهومی، چگونه باید از آن توابع (دستورات) استفاده شود.

Flower
(۱۳۹۷/۰۵/۱۳, ۱۰:۴۸ ق.ظ)admin نوشته: [ -> ]
(۱۳۹۷/۰۵/۱۲, ۰۸:۰۲ ب.ظ)hosein2662 نوشته: [ -> ]فقط یه سوال دیگه این که چطور میشه که یه قسمت موهومی به عدد ما اضافه می شه؟
ممکنه این کد باعث ایجادش شده باشه؟ :

amdx(i+1)=(T*cosd(gamma_m(i))-L(i+1)*sind(gamma_m(i))-D(i+1)*cosd(gamma_m(i)))/m

amdy(i+1)=(L(i+1)*cosd(gamma_m(i))+T*sind(gamma_m(i))-D(i+1)*sind(gamma_m(i))-m*g)/m

باید نتایج اجرای کدها رو مرحله به مرحله در خروجی متلب (MATLAB) چک کنید و ببینید که در کدام مرحله، نتایج به صورت عدد مختلط هستند. 
البته در حالت کلی، این موضوع خیلی مهم نیست و حذف قسمت موهومی اعداد ممکن است نتایج عملیات های ریاضی شما را اشتباه کند (بستگی به منطق ریاضی عملیات ها دارد و اینکه آیا بخش موهومی برای محاسبات مهم است یا نه و اینکه اصلا بخش موهومی باید ایجاد می شده یا نه).
توصیه می شود با راهنمایی استاد خود، حتما فرمول های ریاضی اجرا شده توسط کدها را چک کنید و همچنین عملکرد توابع (دستورات) را هم در Help متلب بخوانید و ببینید که در صورت وجود بخش موهومی، چگونه باید از آن توابع (دستورات) استفاده شود.

Flower
 بسیار متشکر و ممنون از پاسخ مفصل جناب عالی.
بنده کد رو چک کردم و صرفا بخاطر قرار ندادن یک پرانتز که یاعث می شد یک عدد به توان 997/1000 برسه ، عدد مختلط ایجاد می کرد.
ممنون.