2015-06-29 41 views
0

我正在做一個Matlab程序對細胞生長, 我有在main.m文件的一些功能的問題,我發現,我還以爲寫走錯了路的一些功能:如何編寫功能正常

function y = f(c) 
y = 0.5*(1-tanh(4*c-2)); 
function y = h(c) 
y = 0.5*f(c); 
function y = g(c) 
global beta 
y = beta*exp(beta*c); 
%y=1+0.2*c; 

的main.m

%%main program 
clear; clc; 
global alpha beta gamma 
%set parameter values 
alpha = 0.9; beta = 0.5; gamma = 10; 
dx = 1; X = 210; dt = 0.04; T = 16; 
c0 = 1; 
%set up arrays 
x = [dx:dx:X]; Nx = round(X/dx); Nt = round(T/dt); 
p = zeros(1,Nx); nextp = zeros(1,Nx); 
q = zeros(1,Nx); nextq = zeros(1,Nx); 
n = zeros(1,Nx); nextn = zeros(1,Nx); 
u = zeros(1,Nx); v = zeros(1,Nx); r = zeros(1,Nx); c = zeros(1,Nx); 
P = zeros(Nt,Nx); Q = zeros(Nt,Nx); N = zeros(Nt,Nx); 
%set initial values 
p = exp(-0.1.*x); 
function y = f(c) 
y = 0.5*(1-tanh(4*c-2)); 
function y = h(c) 
y = 0.5*f(c); 
function y = g(c) 
global beta 
y = beta*exp(beta*c); 
%y=1+0.2*c; 

%start FDM time-stepping 
for k=1:Nt 
    r = p + q; 
    c = (c0.*gamma./(gamma+p)).*(1-alpha.*(p+q+n)); 
    for i=2:Nx-1 
     u(i)=((p(i+1)-p(i-1))*r(i)*(r(i+1)-r(i-1))+ 4*p(i)*r(i)*... 
      (r(i+1)-2*r(i)+r(i-1))-p(i)*(r(i+1)-r(i-1))^2)/(2*... 
      (dx*r(i))^2); 
     v(i)=((q(i+1)-q(i-1))*r(i)*(r(i+1)-r(i-1))+ 4*q(i)*r(i)*... 
      (r(i+1)-2*r(i)+r(i-1))-q(i)*(r(i+1)-r(i-1))^2)/(2*... 
      (dx*r(i))^2); 
    end 
    nextp=p+dt.*(u+g(c).*p.*(1-(p+q+n))-f(c).*p); 
    nextq=q+dt.*(v+f(c).*p-h(c).*q); 
    nextn=n+dt.*(h(c).*q); 
    p=nextp; 
    q=nextq; 
    n=nextn; 
    P(k,:)=p; Q(k,:)=q; N(k,:)=n; 
end 
figure(1) 
for n=1:500:Nt 
    plot(P(n,:),'LineWidth',1.2); hold on; 
end 
axis([0 270 0 0.6]); 
figure(2) 
for n=1:500:Nt 
    plot(Q(n,:),'LineWidth',1.2); hold on; 
end 
axis([0 270 0 0.6]); 
figure(3) 
for n=1:500:Nt 
    plot(N(n,:),'LineWidth',1.2); hold on; 
end 
axis([0 270 0 1]); 

animation.m

%create image for cells 
rand('state', sum(100*clock)); 
prefix='t'; 
Nm=0; 
figure(1) 
for n=1:250:Nt 
    Nm=Nm+1; 
    for i=1:Nx 
     tP=round(P(n,i)),tQ=round(Q(n,i)),tN=round(N(n,i)); 
     for m=1:tP 
      theta=2*pi*rand(); 
      plot(i*sin(theta),i*cos(theta),'b.'); hold on; 
     end 
     for m=1:tQ 
      theta=2*pi*rand(); 
      plot(i*sin(theta),i*cos(theta),'r.'); hold on; 
     end 
     for m=1:tN 
      theta=2*pi*rand(); 
      plot(i*sin(theta),i*cos(theta),'k.'); hold on; 
     end 
     axis square 
     axis([-300 300 -300 300]) 
    end 
    print('-djpeg','-r100',sprintf('%s_%s',prefix,num2str(Nm))); 
end 

clear MM 
for i=1:Nm 
    [XX,map]=imread(sprintf('%s_%s',prefix,num2str(i)),'jpeg'); 
    imagesc(XX); 
    MM(i)=getframe; 
    pause(0.1); 
end 

請幫我解決這個問題..

+1

請更具體一點 - 哪個功能是'某些'?使用調試器瀏覽您的代碼,並嘗試首先找到解決方案。另外,看看[如何問好,主題問題](http://stackoverflow.com/help/on-topic)。 –

+0

(1)**注:閱讀[問] **。 (2)至少,縮進你的代碼! (3)請將您的代碼縮小到只涉及相關部分(4),您需要真正解釋您遇到的問題。具體而言,指出存在問題的確切代碼行,並且如果存在錯誤,則逐字包括錯誤消息。如果沒有錯誤,那麼你必須清楚地描述問題所在。 – Dan

回答

0

你是main.m是一個腳本,而不是一個函數(它不是以word函數開始),請參見functionScripts vs. Functions)。

簡而言之:函數聲明不允許在命令行或腳本中僅在函數文件中使用。 按照oro777的建議, 爲每個功能創建一個單獨的文件。

另一種方法是將您的main.m轉換爲函數,通過function main開始。然後在同一文件中允許附加功能的刪除,但這些都是本地功能,這意味着它們只能在該文件中使用。你不能從他們申報的文件之外打電話給他們。

0

您應該寫出輸出錯誤,以便我們可以看到哪個函數編寫得不好。在第一視圖中,我會說你應該使用更長的函數名稱,因爲只有一個字母,它可能很容易被變量名稱遮蔽,我建議不要使用全局變量。

我看到你的函數被定義在與主程序相同的文件中,我建議爲每個文件創建一個函數。例如,具有以下代碼的f_function m-文件。

function y = f_function(c) 
    y = 0.5*(1-tanh(4*c-2)); 

做同樣的你的兩個其他功能和放在同一文件夾作爲你的主程序新創建的M文件。