اطلاعیه

Collapse
No announcement yet.

توابع مثلثاتی در mikroc و بکارگیری آنها در محاسبات

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    توابع مثلثاتی در mikroc و بکارگیری آنها در محاسبات

    سلام دوستان
    به سنوس اینورس و کسینوس اینورس و تانژانت اینورس خیلی نیاز دارم در mikro c
    در زبان c این توابع رو چگونه می نویسن؟
    با سپاس

    #2
    پاسخ : تابع cos^-1

    سلام.به Help نرم افزار مراجعه کنین.اگه پاسخ مناسبی براش نداشت، مقادیر رو تو یه ماتریس ثابت بنویسین و اون رو فراخوانی کنین.البته اگه بازه ی تغییرات زاویه مشخص و رند باشه.

    دیدگاه


      #3
      پاسخ : تابع cos^-1


      الان مقدار رو دارم که یک عدد کوچکتر از یک است و حالا می خوام تبدیلش کنم به زاویه - تو help چیزی مشاهده نکردم در موردشون

      دیدگاه


        #4
        پاسخ : تابع cos^-1

        میتونی برنامه اش رو براساس بسط مک لورن توابه معکوس بنویسی.
        فقط یکم زمان پردازش بیشتری ازت میگیره
        یا اگر هم حوصله نداری برو توی فایل کتابخونه ی math.h از کامپایلر کدویژن کدهای مربوط به توابع رو بردار و یکم دستکاریشون کن تا توی میکرو سی هم جواب بده
        ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

        امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

        دیدگاه


          #5
          پاسخ : تابع cos^-1

          سلام

          با احترام اجازه بدهید تا چند مطلب را با هم مرور کنیم :

          خیلی خلاصه خدمت تان عرض کنم که من خودم به همین مورد برخورد کرده ام. همانطور که صد البته می دانید ، PIC ها نمی توانند توابع معکوس مثلثاتی را به عنوان یک تابع مستقل (یعنی مثل تابع سینوس یا تانژانت) محاسبه کنند . این ربطی به اینکه از کدام محیط استفاده می فرمائید ندارد.
          همانطور که جناب آقای مهندس مستقیمی ، مدیر محترم گروه اشاره فرمودند می توانید از ماتریس استفاده کنید و روش دیگر این است که باید به کمک رشته ها و محاسبات عددی این مقادیر را به دست بیاورید.

          یک روش که در ماشین حساب ها استفاده می شود ، استفاده از سری های نا متناهی و محاسبه این گونه سری هاست . به عنوان نمونه



          و همانطور که باز هم مطمئناً می دانید برای سینوس و کسینوس مقدار Z بین 1+ تا 1- است. بسته به اینکه چه دقتی برایتان مطلوب است می توانید تعدادی متناهی مثلا پنج ، ده ، بیست جمله اول را فقط حساب کنید.
          یک مشکل دیگر که ممکن است پیدا شود این است که PIC ها نمی توانند اعداد شناور (ممیز دار) را محاسبه کنند. اما با تکنیک ها و روش هایی محاسبه اعداد شناور یا ممیز دار در PIC امکان پذیر است اما دقت خیلی خوبی حاصل نخواهد شد.

          به عنوان بیان یک مثال خیلی ساده : اگر اعداد شناور را ابتدای کار 100 برابر بزرگ کنید (ضرب در 100) ، دو رقم سمت راست بعد از ممیز ؛ از قسمت شناور Floating Point به قسمت صحیح عدد Integer منتقل می شوند آنگاه محاسبات را انجام میدهید و در انتها دو رقم سمت راست را با یک ممیز ساختگی به صورت شناور نمایش می دهید. این کار هم خیلی جالب نیست چون که متغیرها ابعاد و اندازه دارند و نمی توانند از حد استانداردشان 8 بیت یا 16 بیت فراتر بروند. شاید هم 32 بیت بسته به اینکه کدام مدل از خانواده PIC را انتخاب می کنید.

          مطلب بعدی این است که اگر امکان منفی شدن یک عدد محتمل باشد. باز ابعاد اعداد قابل ذخیره در متغیرها کوچکتر می شوند یعنی شما از صفر تا 255 + را در 8 بیت جای می دهید اما اگر احتمال منفی شدن باشد ( که اینجا هست !! )متناسب با آن محدوده کار از 128- تا 127+ در 8 بیت خواهد بود که این خود نوعی محدودیت است. یعنی برای ذخیره 129 شما 16 بیت نیاز دارید.

          نکته بعدی این است که با در نظر گرفتن متغیرهای بزرگتر ، به دلیل محدودیت های سخت افزاری حافظه ، ممکن است برنامه بعد از کامپایل Compile شدن در PIC جای نگیرد.

          صد البته باید مواظب بود که متغیر ها سرریز (Overflow) نشوند.

          فکر می کنم که اگر خواستید که نتیجه را به درجه نشان بدهید باید دوباره مقادیر را از رادیان به درجه تغییر دهید. چون سری ها نتایج شان برای رادیان است. برای این مورد بیشتر بررسی بفرمائید و اما نکته خیلی مهم این مورد را هم مد نظر قرار دهید که :

          به ازای یک x یکتا در توابع وارون مثلثاتی می‌توان چندین y پیدا کرد که به ازای آن تابع وارون مثلثاتی ما (آرک ) معتبر است ، مانند آرک سینوس صفر، که زاویه جواب π و 2π است به ازای همهٔ آن‌ها مقدار سینوس یا x برابر با صفر است و این به این معنی است که تابع وارون سینوس یا arcsin می‌تواند می‌تواند چندین جواب داشته باشد درحالی که این خلاف مفهوم تابع بودن است. برای همین برای تمامی تابع‌های وارون مثلثاتی محدودیت بُرد یا خروجی قرار می‌دهیم تا به ازای یک ورودی چندین خروجی نداشته باشند.

          دو تابع زیر نمونه هایی برای محاسبه کسینوس معکوس و تانژانت معکوس با استفاده از سری های نامتناهی هستند :





          فقط به عنوان یکی از مراجع در دسترس ، مطالب بیشتر در باره سری ها را می توانید در ویکی پدیا ببینید :

          http://en.wikipedia.org/wiki/Inverse...tric_functions

          مزید بر قدرشناسی است و بسیار بسیار خوشحال می شوم که نتیجه کارتان را برای استفاده بنده و دیگران به اشتراک بگذارید.

          همگی موفق باشیم
          والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

          هوشمندانه بپرسيد...

          دیدگاه


            #6
            پاسخ : تابع cos^-1

            مرسی مهندس رضا و مهندس مستقیمی
            من تابع رو بر اساس این فرمول ها می نویسم
            در این پروژه هدف این است مقدار power factor خط شناسایی شود (که شناسایی کردم) . حال نیاز دارم زاویه اون رو پیدا کنم که بتوانم بر اساس فرمول خازن مورد نیاز خط و همچنین راکتانس مورد نیازخط رو محاسبه کرده و در اختیارمان قرار دهد.
            کاشکه بین بچه ها کسی می بود که یک کتابخانه قدرتمند ریاضیات برای میکروکنترلر ها pic می نوشت - عیبی نداره - خودمون می نویسم
            همگی موفق باشیم - حتما نتیجه رو در اختیار عموم قرار می دم.

            دیدگاه


              #7
              پاسخ : تابع cos^-1

              دوستان توابع سینوسی و کسینوسی به فرم زیر تعریف می شود
              du1 = cosE3(80); که نتیجه روی میکرو به صورت ممیزی نشان نمی دهد مثلا کسینوس 80 رو به فرم 174 نشان می دهد در حالی که جواب : 0.174 است برای همین از متن ثابت که دارای 0. است استفاده کردم که برای نشان دان مقدار خوب است ولی در محاسبات چیزی رو عوض نمی کند.
              این مشکلی است که بهش برخورد کردم - برای اینورس از asin , acos باید استفاده کردکه در کتابخانه موجود می باشد
              کد:
              int aT1[1];
              double du1;
              
              int aT2[1];
              double du2;
              void main(){ Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF);
              
               while(1)
               {
              
                 du1 = cosE3(80);
                 wordTostr(du1, aT1);
                 Lcd_Out(1,1,"cos: 0.");
                 Lcd_Out(1,8,aT1);
              
                 du2 = sinE3(80);
                 wordTostr(du2, aT2);
                 Lcd_Out(2,1,"sin: 0.");
                 Lcd_Out(2,8,aT2);
              
               }}

              دیدگاه


                #8
                پاسخ : تابع cos^-1

                منغیر رو به شکل float تعریف کنین ببینین درست میشه؟ اگه نشد هم خودتون به شکل دستی تقسیم بر 100 کنین و بعد تبدیل به رشته کنین و نمایش بدین.

                دیدگاه


                  #9
                  پاسخ : تابع cos^-1

                  خوب کدها به شکل زیر تغییر پیدا کرد :
                  کد:
                  float aT1[10];
                  double du1;
                  
                  float aT2[10];
                  double du2;
                   while(1)
                   {
                     du1 = cosE3(80)*0.001;
                     floatTostr(du1, aT1);
                     Lcd_Out(1,1,"cos:");
                     Lcd_Out(1,6,aT1);
                      
                     du2 = sinE3(80)*0.001;
                     floatTostr(du2, aT2);
                     Lcd_Out(2,1,"sin:");
                     Lcd_Out(2,6,aT2);
                   }
                  و جواب به شکل زیر بود برای سینوس و کسینوس :
                  sin : 9.849999 e-1
                  cos:1.739999e-1

                  دیدگاه


                    #10
                    پاسخ : تابع cos^-1

                    نوشته اصلی توسط mehdiravanbod
                    خوب کدها به شکل زیر تغییر پیدا کرد :
                    کد:
                    float aT1[10];
                    double du1;
                    
                    float aT2[10];
                    double du2;
                     while(1)
                     {
                    
                       du1 = cosE3(80)*0.001;
                       floatTostr(du1, aT1);
                       Lcd_Out(1,1,"cos:");
                       Lcd_Out(1,6,aT1);
                       
                       
                       du2 = sinE3(80)*0.001;
                       floatTostr(du2, aT2);
                        Lcd_Out(2,1,"sin:");
                       Lcd_Out(2,6,aT2);
                     }

                    و جواب به شکل زیر بود برای سینوس و کسینوس :
                    sin : 9.849999 e-1
                    cos:1.739999e-1
                    و این جوابها یعنی نتیجه ی دلخواهتون رو بدست آوردین؟

                    دیدگاه


                      #11
                      پاسخ : تابع cos^-1

                      معادلات برای ریاضیات پیچیده
                      توابع مثلثاتی و اینورس یا آرک آنها به وسیله mikroc حل شد- نتایج در توابع ریاضیات بر حسب رادیان است که باید آنها رو تبدیل به درجه کرد این موضوع برای تمام میکروکنترلر ها و انواع کامپایلر و برنامه به زبان c اینگونه است زیرا استاندارد زبان c می باشد برای اینکه بر حسب درجه برای ما حل شود به شکل زیر باید عمل کرد : مثلا برا کسینوس 60 درجه :
                      du1 = cos(60 *(3.14159265/180)); جواب برابر است با 0.5

                      حال برای تبدیل مقدار 0.5 به درجه به شکل زیر عمل می کنیم :
                      du2 = acos(du1);
                      du2 = (du2*180)/3.14159265; جواب 60 درجه خواهد بود
                      برای بقیه توابع مثلثاتی نیز به همین شکل عمل می کنیم.
                      برای دانلود برنامه و شبیه سازی آن به لینک زیر مراجعه کنید :
                      http://s5.picofile.com/file/8136264134/mathex.rar.html
                      :nice:


                      دیدگاه


                        #12
                        پاسخ : تابع cos^-1

                        نوشته اصلی توسط mehdiravanbod
                        معادلات برای ریاضیات پیچیده ...
                        ...برای دانلود برنامه و شبیه سازی آن به لینک زیر مراجعه کنید :
                        http://s5.picofile.com/file/8136264134/mathex.rar.html
                        :nice:
                        ممنونم که به قولت وفادار باقی ماندی و نتیجه را منعکس کردی....

                        همگی موفق باشیم......
                        والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

                        هوشمندانه بپرسيد...

                        دیدگاه

                        لطفا صبر کنید...
                        X