اطلاعیه

Collapse
No announcement yet.

تبدیل یک رشته به تابع برای حل در متلب

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

    تبدیل یک رشته به تابع برای حل در متلب

    ضمن عرض سلام به دوستان
    من یک تابع میخوام توسط دستور fsolve حل کننم، ولی به دلیل طولانی بودن تابع ورودی و عدم امکان تابپ، مجبور شدم به صورت رشته تابع بسازم، به این شکل یک ام فایل دارم:
    [code=matlab]
    function F = matrix(v)
    M=[];
    for d=1:9
    A=sprintf('3*v(%d)-v(%d+1)- 3;',d,d);
    M=vertcat(M,A);
    end
    B=sprintf('2*v(%d)-v(%d+1)-10;',d,d);
    M=vertcat(M,B);
    F=[M];
    end
    [/code]
    ( البته d تا 200 قراره بره، چون اجراش خیلی طولانی میشد، اینجا خلاصه نوشتم)
    F تابع منه که قراره حل بشه و حالا از نوع string هست.
    ( یه دستگاه معادلات 200 متغیره و 200 مجهول است که میخوام با دستور fsolve حل کنم. )
    حالا مشکل من اینجاست وقتی برای اجرا در Command Window تابع فراخوانی میکنم
    [code=matlab]
    [x,fval] = fsolve(@matrix,ّF0) % Call solver
    [/code]
    به دلیل string بودن F اجرا نمیشه.
    چجوری باید این تبدیل انجام بدم؟
    از سیمبول هم نمیشه استفاده کرد، چون v(1) v(2) v(3) و .... دارم.
    واقعا ممنون میشم کمکم کنید. خیلی مهمه برام

    #2
    پاسخ : تبدیل یک رشته به تابع برای حل در متلب

    کد:
    function F = matrix1(x) ;
    for d=1:200
      A(d,:)=3*x(d)-x(d+1)- 3;
    end
    A(d+1,:)=2*x(d)-x(d+1)-10;
    F=A;
    کد:
     [x,fval] = fsolve(@matrix1,x0
    در ضمن شما چون عادلاتتون خطیه بهتری ماتریسی حل کنید

    دیدگاه


      #3
      پاسخ : تبدیل یک رشته به تابع برای حل در متلب

      نوشته اصلی توسط naser1363
      کد:
      function F = matrix1(x) ;
      for d=1:200
        A(d,:)=3*x(d)-x(d+1)- 3;
      end
      A(d+1,:)=2*x(d)-x(d+1)-10;
      F=A;
      کد:
       [x,fval] = fsolve(@matrix1,x0
      در ضمن شما چون عادلاتتون خطیه بهتری ماتریسی حل کنید
      مهندس عزیز دست گلت درد نکنه واقعا ..
      معالاتم یکم پیچیده شده از نظر حجم داره اذیتم میکنه ...
      داخل ام فایل اصلیم جواب نداد، ام فایل میزارم روش توضیح میدم، ممنونت میشم بتونی گرهشو باز کنی.
      [code=matlab]
      function F =v(Ven)
      load Ven
      load I_block
      Time=I_Block(1,;
      i=200;
      % IN THE NAME OF GOD
      %Vn_dot=((d/4*PI)*((Vn(n-1)-2*Vn(n)+Vn(n+1))/(delta_x)^2 + (Ve(n-1)-2*Ve(n)+Ve(n+1))/(delta_x)^2)- Iin )/Cm;
      %Iin(n,t)=gna*(m^3)*h*(V(n,t)-vna)+gk*(N^4)*(V(n,t)-vk)+gl(V(n,t)-vl);
      % T is the temperature insted of sentigerad
      T=18.5;
      q=3^((T-6.3)/10);
      % am=q*((2.5-0.1*V(n,t))/(exp(2.5-0.1*V(n,t))-1));
      % bm=q*4*exp(-1*V(n,t)/18);
      % ah=q*0.07*exp(-1*V(n,t)/20);
      % bh=q*(1/(exp(3-0.1*V(n,t))+1));
      % an=q*((0.1*(1-00.1*V(n,t)))/(exp(1-0.1*V(n,t))-1));
      % bn=q*0.125*exp(-1*V(n,t)/880);
      %
      % % inital value in V=0 & 18.5 degree of sentigrad :
      % if(V==0)
      % m=0.053;
      % h=0.596;
      % N=0.318;
      % end
      %
      % m_dot= am*(1-m) - bm*m;
      % h_dot= ah*(1-h)-bh*h;
      % N_dot= an*(1-N)-bn*N;

      gna= 12; % Ohm.m^2
      gk= 3.6; % Ohm.m^2
      gl= 0.03;% Ohm.m^2
      vna= 0.115; % Vlolt
      vk= -0.012; % Vlolt
      vl= 0.010589; % Vlolt

      d=1*10^(-6); % insted of meter
      PI=0.345; % insted of Ohm.m
      Cm= 1*10^(-2); % F/m^2
      delta_x= 0.2*10^(-3); % delta X insted Of meter For 1um diameter of unmiulinet axon
      simple_rate=1*10^(-5); %Simple rate Of I_Block Generator

      %for t=2: size(Time,2)
      t=2;
      %for t=2:140
      for n=1:i
      if t==2
      % inital value in V(n,0) & 18.5 degree of sentigrad
      m(n,t-1)=0.053;
      h(n,t-1)=0.596;
      N(n,t-1)=0.318;
      V(n,t-1)=0; % Megdare avalie tamamie Block ha =0
      V(n+1,t-1)=0; % Megdare avalie tamamie Block ha =0
      end

      if n==1 % First Block
      V(n,t) = ((((d/4*PI)*(((-1*V(n,t)+V(n+1,t))/(delta_x)^2) + ((-1*Ven(n,t)+Ven(n+1,t))/(delta_x)^2))- gna*(m(n,t-1)^3)*h(n,t-1)*(V(n,t)-vna)+gk*(N(n,t-1)^4)*(V(n,t)-vk)+gl*(V(n,t)-vl))/Cm)*simple_rate)+V(n,t-1);
      end

      if (1<n)&&(n<i) % Mide Blocks
      V(n,t) = ((((d/4*PI)*(((V(n-1,t)-2*V(n,t)+V(n+1,t))/(delta_x)^2) + ((Ven(n-1,t)-2*Ven(n,t)+Ven(n+1,t))/(delta_x)^2))- gna*(m(n,t)^3)*h(n,t)*(V(n,t)-vna)+gk*(N(n,t-1)^4)*(V(n,t)-vk)+gl*(V(n,t)-vl))/Cm)*simple_rate)+V(n,t-1);
      end

      if n==i % Last Block
      V(n,t) = ((((d/4*PI)*(((V(n-1,t)-1*V(n,t))/(delta_x)^2) + ((Ven(n-1,t)-1*Ven(n,t))/(delta_x)^2))- gna*(m(n,t-1)^3)*h(n,t-1)*(V(n,t)-vna)+gk*(N(n,t-1)^4)*(V(n,t)-vk)+gl*(V(n,t)-vl))/Cm)*simple_rate)+V(n,t-1);
      end

      am(n,t)=q*((2.5-0.1*V(n,t))/(exp(2.5-0.1*V(n,t))-1));
      bm(n,t)=q*4*exp(-1*V(n,t)/18);
      ah(n,t)=q*0.07*exp(-1*V(n,t)/20);
      bh(n,t)=q*(1/(exp(3-0.1*V(n,t))+1));
      an(n,t)=q*((0.1*(1-00.1*V(n,t)))/(exp(1-0.1*V(n,t))-1));
      bn(n,t)=q*0.125*exp(-1*V(n,t)/880);

      m(n,t)= ((am(n,t)*(1-m(n,t-1)) - bm(n,t)*m(n,t-1))*simple_rate)+m(n,t-1);
      h(n,t)= ((ah(n,t)*(1-h(n,t-1)) - bh(n,t)*h(n,t-1))*simple_rate)+h(n,t-1);
      N(n,t)= ((an(n,t)*(1-N(n,t-1)) - bn(n,t)*N(n,t-1))*simple_rate)+N(n,t-1);

      end
      F=A;
      %end
      %plot(1:1:140,V(1,);
      %mesh(V);
      end[/code]

      دیدگاه


        #4
        پاسخ : تبدیل یک رشته به تابع برای حل در متلب

        دارم یه پارامتر دو متغیره حل میکنم V(n,t) که n از 1 تا 200 تغییر میکنه در حلقه for داخلی و بعد که حلقه تمام شد و به اضای اون t مشخص ، در حلقه for خارجی مقدار t یک واحد اضافه میشه تا 1000 بار.

        خط 57 - 61 - 65 این معادلات v نوشتم.

        و همزمان با حل اون مقادیر v ، برای محاسبه v مرحله بعد، باید یه سری پارامتر دیگه محاسبه بشه
        خط 75 - 76 -77

        چیکار کنم؟
        اگه پیشنهاد شما ماتریسی روش حلشم بگید لطفا
        واقعا سپاس از وقتی که میزاری دوست عزیز

        دیدگاه


          #5
          پاسخ : تبدیل یک رشته به تابع برای حل در متلب

          الان مجهولات چی هستند؟ معلومات کدامند؟

          دیدگاه


            #6
            پاسخ : تبدیل یک رشته به تابع برای حل در متلب

            نوشته اصلی توسط naser1363
            الان مجهولات چی هستند؟ معلومات کدامند؟
            مجهولات v(n,t) هستند که به صورت خلاصه بخوام بنویسم این شکلی میشه:
            v(1,=0;
            v(:,1)=0;
            a=2; b=3;
            for t=2:1000
            for n=2:200
            v(n,t)= (((v(n-1 ,t) _2*v(n,t)+v(n +1,t))+a)*b)+v(n,t-1);
            end
            end

            دیدگاه


              #7
              پاسخ : تبدیل یک رشته به تابع برای حل در متلب

              همین معادله ساده شده رو خودتون برای n برابر دو و سه و t برابر دو بنویسید. بنظرم تعداد مجهولات بیشتر از معادلاته

              دیدگاه

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