اطلاعیه

Collapse
No announcement yet.

استفاده از تابع

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

    استفاده از تابع

    سلام
    من در مطلب برنامه ای نوشته ام ولی در یک قسمت از آن مشکل دارم. ممنون میشم اگه کمکم کنید.
    من با استفاده از برنامه function مقادیر مربوط به 8 متغیر x,y,z,w,t,a,b,c را به دست آورده ام. بعد از به دست آوردن آنها باید در داخل برنامه اصلی (main) از این 8 متغیر استفاده کنم. چطوری باید این 8 متغیر را در برنامه اصلی با استفاده از تابع آدرس دهی کنم.
    شدیدا به کمک نیاز دارم. :read: :read:
    خیلی ممنون

    #2
    پاسخ : استفاده از تابع

    سلام
    کافیه قبل از نام تابع خروجیها رو بنویسید، برای مثال تابع myfun هم جمع و هم ضرب دو عدد ورودی x و y را در خروجیهای s و m میریزد:
    کد:
    function [m s] = myfun(x,y)
    m = x.*y;
    s = x+y;
    حالا تو برنامه اصلی هر جا که به مقادیر m و s نیاز داشتید به شکل زیر مقدارشون رو بگیرید:
    کد:
    >> [q1 q2] = myfun(4,5)
    
    q1 =
    
      20
    
    
    q2 =
    
       9

    دیدگاه


      #3
      پاسخ : استفاده از تابع

      سلام
      خیلی ممنون بابت جواب
      اگر که هر کدام از این خروجیها به صورت ماتریس j*1 باشند اون موقع باید چطوری در برنامه اصلی اعمال کرد؟
      ممنون میشم از جوابتون
      راستی می تونم ازتون سوالی بپرسم؟ :question:
      من هم دانشجوی کارشناسی ارشد برق الکترونیک- اپتیک هستم که البته به نانو مربوط میشه. آیا شما در زمینه رشته خودتون مشغول به کار هستید؟ میشه در این زمینه کاری موجود در این رشته منو راهنمایی کنید؟

      دیدگاه


        #4
        پاسخ : استفاده از تابع

        سلام،

        نوشته اصلی توسط elm_8688
        اگر که هر کدام از این خروجیها به صورت ماتریس j*1 باشند اون موقع باید چطوری در برنامه اصلی اعمال کرد؟
        هیچ فرقی نمیکنه. چون متغیرها تو matlab ماتریس هستند. پس فرقی نمیکنه j*1 باشه یا i*j

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

        دیدگاه


          #5
          پاسخ : استفاده از تابع

          سلام
          ممنون بابت راهنمایی شما
          ولی من بازم مشکل دارم بذارید یک با هم بگم
          هر کدام از خروجیهای مثلا x,y من 181 تا مقدار دارند که در برنامه مورد نظر و اصلی هم این 181 مقدار از هر متغیر خروجی را لازم دارم . در این صورت چطوری می تونم آنها را در برنامه اصلی وارد کنم. میشه یک با هم بگید .
          شرمنده ممنونم.

          دیدگاه


            #6
            پاسخ : استفاده از تابع

            سلام
            مثلا تابع زیر رو در نظر بگیرید. متغیرهای x و y دارای 13 ستون هستند که مقادیر آنها داخل تابع محاسبه میشود:
            کد:
            function [x y z w] = myfun(i1,i2)
            x = [1 2 1 4 5 2 1 2 5 4 1 2 5];
            y = [1 2 3 5 4 5 8 2 1 2 2 1 2];
            z = i1;
            w = i2;
            حالا در برنامه اصلی میخواهیم به مقادیر خروجیها دست پیدا کنیم. مثلا مقدار پنجم x و مقدار هشتم y را میخواهیم با هم جمع کنیم و در متغیر h بریزیم:
            کد:
            [x y z w]=myfun(5,1);
            h = x(5)+y(8);
            امیدوارم سوالتون رو فهمیده باشم.
            اگر نه، تابع و برنامه تون رو بزارید تا ببینم

            دیدگاه


              #7
              پاسخ : استفاده از تابع

              نوشته اصلی توسط BlueApple
              سلام
              مثلا تابع زیر رو در نظر بگیرید. متغیرهای x و y دارای 13 ستون هستند که مقادیر آنها داخل تابع محاسبه میشود:
              کد:
              function [x y z w] = myfun(i1,i2)
              x = [1 2 1 4 5 2 1 2 5 4 1 2 5];
              y = [1 2 3 5 4 5 8 2 1 2 2 1 2];
              z = i1;
              w = i2;
              حالا در برنامه اصلی میخواهیم به مقادیر خروجیها دست پیدا کنیم. مثلا مقدار پنجم x و مقدار هشتم y را میخواهیم با هم جمع کنیم و در متغیر h بریزیم:
              کد:
              [x y z w]=myfun(5,1);
              h = x(5)+y(8);
              امیدوارم سوالتون رو فهمیده باشم.
              اگر نه، تابع و برنامه تون رو بزارید تا ببینم
              سلام
              خیلی ممنون از توضیحات شما.بله متوجه شدم.
              حالا اگه بخوام در برنامه دیگه ای یعنی برنامه سومم از این مقادیر به دست آمده x,y,z,w استفاده کنم اینجا چطوری از تابع باید استفاده کنم.؟؟ چون در چند برنامه باید از این مقادیر به دست آمده استفاده کنم.
              ممنون میشم اگه جواب این سوالمم بدید.

              دیدگاه


                #8
                پاسخ : استفاده از تابع

                سلام
                شما وقتی یک تابع می نویسید، اون رو به شکل یک m-file ذخیره میکنید. اولین خط این m-file همون دستور تعریف تابع است و خطوط بعدی هم مربوط به خواندن ورودی ها و محاسبه خروجی هاست.
                نام این m-file هم باید با نام تابع یکی باشد. مثلا در مورد تابعی که من مثال زدم، نام m-file برابر است با myfun.m
                کد:
                function [x y z w] = myfun(i1,i2)
                x = [1 2 1 4 5 2 1 2 5 4 1 2 5];
                y = [1 2 3 5 4 5 8 2 1 2 2 1 2];
                z = i1;
                w = i2;
                حالا که تابع رو به این شکل ذخیره کردید، هر برنامه ای که داشته باشید میتونید با دستور زیر اون تابع رو فراخوانی کنید:
                کد:
                [x y z w]=myfun(5,1);
                مثلا در برنامه prog1.m و prog2.m نیاز به مقادیر x تا z دارید. خوب دستور [x y z w]=myfun(5,1); رو در هر دو اجرا کنید.
                من فکر میکنم شما تابع رو در همون برنامه اصلی تعریف کردین. (یعنی در قسمت زیرین کد برنامه اصلی) اگر اینکارو کرده باشین نمیتونین از تابعتون در برنامه سوم استفاده کنین. ولی اگر طبق اونچه که در بالا گفتم عمل کنین میتونین تابع رو در هر برنامه ای که میخواین فراخوانی کنین.
                اگر نشد، در خدمتیم

                دیدگاه


                  #9
                  پاسخ : استفاده از تابع

                  نوشته اصلی توسط BlueApple
                  سلام
                  شما وقتی یک تابع می نویسید، اون رو به شکل یک m-file ذخیره میکنید. اولین خط این m-file همون دستور تعریف تابع است و خطوط بعدی هم مربوط به خواندن ورودی ها و محاسبه خروجی هاست.
                  نام این m-file هم باید با نام تابع یکی باشد. مثلا در مورد تابعی که من مثال زدم، نام m-file برابر است با myfun.m
                  کد:
                  function [x y z w] = myfun(i1,i2)
                  x = [1 2 1 4 5 2 1 2 5 4 1 2 5];
                  y = [1 2 3 5 4 5 8 2 1 2 2 1 2];
                  z = i1;
                  w = i2;
                  حالا که تابع رو به این شکل ذخیره کردید، هر برنامه ای که داشته باشید میتونید با دستور زیر اون تابع رو فراخوانی کنید:
                  کد:
                  [x y z w]=myfun(5,1);
                  مثلا در برنامه prog1.m و prog2.m نیاز به مقادیر x تا z دارید. خوب دستور [x y z w]=myfun(5,1); رو در هر دو اجرا کنید.
                  من فکر میکنم شما تابع رو در همون برنامه اصلی تعریف کردین. (یعنی در قسمت زیرین کد برنامه اصلی) اگر اینکارو کرده باشین نمیتونین از تابعتون در برنامه سوم استفاده کنین. ولی اگر طبق اونچه که در بالا گفتم عمل کنین میتونین تابع رو در هر برنامه ای که میخواین فراخوانی کنین.
                  اگر نشد، در خدمتیم
                  سلام دوست من
                  واقعا بابت توضیحات شما خیلی ممنونم.من دقیقا متوجه چیزی که شما گفتید شدم و در برنامه ام اعمال کردم ولی هنوز ایراد دارم
                  من به صورت زیر نوشته ام :
                  اولین mفایل به نام Func
                  function [R] = Func(x)
                  معادلات مربوطه
                  end

                  بعد در برنامه اصلی با نام ROOTS_Final
                  clear all
                  close all
                  clc
                  .
                  .
                  .
                  [x,fval] = fsolve(@Func,x0,options)

                  از اینجا برای من مقادیر f10,f20,f30,f40,f50,f60,f70,f80 به دست آمدند . حالا در برنامه سوم می خواهم که از این 8 مقدار f10 تا f80 استفاده کنم.
                  مطابق کفته شما باید بنویسم :
                  Func (x)=[f10;f20;f30;f40;f50;f60;f70;f80]

                  یعنی دیگه چیزی لازم نیست که بنویسم؟؟ آخه در این حالت ایراد می گیره . چیکار کنم؟؟؟؟
                  ممنون میشم اگه بازم کمکم کنید . شدیدا به کمک نیاز دارم .
                  خیلی ممنون
                  موفق باشید
                  منتظرم شدید

                  دیدگاه


                    #10
                    پاسخ : استفاده از تابع

                    نوشته اصلی توسط elm_8688
                    سلام دوست من
                    واقعا بابت توضیحات شما خیلی ممنونم.من دقیقا متوجه چیزی که شما گفتید شدم و در برنامه ام اعمال کردم ولی هنوز ایراد دارم
                    من به صورت زیر نوشته ام :
                    اولین mفایل به نام Func
                    function [R] = Func(x)
                    معادلات مربوطه
                    end

                    بعد در برنامه اصلی با نام ROOTS_Final
                    clear all
                    close all
                    clc
                    .
                    .
                    .
                    [x,fval] = fsolve(@Func,x0,options)

                    از اینجا برای من مقادیر f10,f20,f30,f40,f50,f60,f70,f80 به دست آمدند . حالا در برنامه سوم می خواهم که از این 8 مقدار f10 تا f80 استفاده کنم.
                    مطابق کفته شما باید بنویسم :
                    Func (x)=[f10;f20;f30;f40;f50;f60;f70;f80]

                    یعنی دیگه چیزی لازم نیست که بنویسم؟؟ آخه در این حالت ایراد می گیره . چیکار کنم؟؟؟؟
                    ممنون میشم اگه بازم کمکم کنید . شدیدا به کمک نیاز دارم .
                    خیلی ممنون
                    موفق باشید
                    منتظرم شدید

                    سلام
                    میشه کمکم کنید؟ :cry: :read:

                    دیدگاه


                      #11
                      پاسخ : استفاده از تابع

                      سلام
                      چیزی که من متوجه شدم اینه که شما یک تابع نوشته اید که میخواهید با دستور fsolve ریشه هاش رو پیدا کنید. درسته؟
                      در اینجا مقادیر f10 تا f80 خروجیهای تابع نیستند. بلکه جواب بدست آمده از اجرای دستور fsolve هستند.
                      اگر میخواهید اونهارو در برنامه های دیگر هم داشته باشید دو راه به نظرم میرسه:

                      1- اگر میتونید برنامه اصلیتون رو که ROOTS_Final هست به یک تابع تبدیل کنید و مقادیر f10 تا f80 رو در خروجیهای این تابع بگذارید:
                      (ورودی ها)function [f10 f20 f30 f40 f50 f60 f70 f80] = ROOTS_Final
                      حالا هر جا نیاز داشتید برنامه اصلی رو (که حالا تابع شده) اجرا میکنید:

                      (ورودی ها)f [f10 f20 f30 f40 f50 f60 f70 f80] = ROOTS_Final
                      2- با دستور save به راحتی f10 تا f80 رو در هارد ذخیره کنید و هر جا نیاز داشتید اونها رو با دستور load بخوانید
                      مثلا"
                      save f10 f10
                      متغیر f10 رو با نام f10 در دایرکتوری جاری ذخیره میکنه و
                      load f10
                      اون رو لود میکنه

                      دیدگاه


                        #12
                        پاسخ : استفاده از تابع

                        نوشته اصلی توسط BlueApple
                        سلام
                        چیزی که من متوجه شدم اینه که شما یک تابع نوشته اید که میخواهید با دستور fsolve ریشه هاش رو پیدا کنید. درسته؟
                        در اینجا مقادیر f10 تا f80 خروجیهای تابع نیستند. بلکه جواب بدست آمده از اجرای دستور fsolve هستند.
                        اگر میخواهید اونهارو در برنامه های دیگر هم داشته باشید دو راه به نظرم میرسه:

                        1- اگر میتونید برنامه اصلیتون رو که ROOTS_Final هست به یک تابع تبدیل کنید و مقادیر f10 تا f80 رو در خروجیهای این تابع بگذارید:
                        (ورودی ها)function [f10 f20 f30 f40 f50 f60 f70 f80] = ROOTS_Final
                        حالا هر جا نیاز داشتید برنامه اصلی رو (که حالا تابع شده) اجرا میکنید:

                        (ورودی ها)f [f10 f20 f30 f40 f50 f60 f70 f80] = ROOTS_Final
                        2- با دستور save به راحتی f10 تا f80 رو در هارد ذخیره کنید و هر جا نیاز داشتید اونها رو با دستور load بخوانید
                        مثلا"
                        save f10 f10
                        متغیر f10 رو با نام f10 در دایرکتوری جاری ذخیره میکنه و
                        load f10
                        اون رو لود میکنه
                        سلام .بله همینطوره که گفتید
                        از راهنماییهای شما خیلی ممنونم. متوجه شدم که باید چیکار کنم و اسه همین ازتون ممنونم :smile:
                        چند تا سوال دیگه هم دارم فقط امیدوارم که خستتون نکرده باشم
                        آیا این کارهایی که انجام دام صحیح هستند:
                        1.من function اول یعنی mfile اول که توش معادلاتم رو تعریف کردم رو هیچ تغییری در آن ایجاد نکردم
                        2.برنامه اصلی دوم را مطابق گفته شما به تابع تعریف کردم به صورت زیر:
                        function [f10 f20 f30 f40 f50 f60 f70 f80]=ROOTS_Final(x) فقط در این سطر برای x ایراد می دهد که input argument x must be unused
                        بعد در داخل همین تابع مقادیر fها را با استفاده از دستور fsolve به دست آوردم و در داخل بردار خروجی x به ترتیب قرار دادم
                        3.در این برنامه اصلی در جایی که لازم است بدین صورت فراخوانی کردم :
                        .
                        .
                        [f10 f20 f30 f40 f50 f60 f70 f80]=ROOTS_Final(x)
                        .
                        .
                        آیا تا اینجا کارهایی که انجام داده ام صحیح می باشند؟؟؟
                        بازهم منتظر راهنمایی شما هستم . :read:

                        دیدگاه


                          #13
                          پاسخ : استفاده از تابع

                          سلام
                          شما x رو به عنوان ورودی تابع ROOTS_Final گذاشتید، ولی احتمالا از اون توی برنامه استفاده نکردین که چنین پیغامی داده
                          وقتی ازش استفاده ای نکردین اصلا از خط اول تابع حذفش کنین: (تابع در matlab میتونه هیچ ورودی نداشته باشه)
                          function [f10 f20 f30 f40 f50 f60 f70 f80] = ROOTS_Final

                          دیدگاه


                            #14
                            پاسخ : استفاده از تابع

                            سلام
                            مگه میشه تابع ورودی نداشته باشه؟؟ :question:
                            آیا در داخل function میشه متغیر ها رو به صورت syms تعریف کرد؟
                            وقتی از دستور fsolve در داخل function استفاده می کنم به صورت :
                            [x,fval] = fsolve(@Func,x0,options); آیا نوشتن fval اجباری است یا نه ؟

                            با سپاس از محبت شما

                            دیدگاه


                              #15
                              پاسخ : استفاده از تابع

                              سلام
                              بله تابع میتونه هیچ ورودی نداشته باشه
                              داخل function میشه syms تعریف کرد
                              نوشتن fval اجباری نیست

                              دیدگاه

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