如何正确编写函数

时间:2015-06-29 06:36:45

标签: matlab function

我制作了一个用于细胞生长的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

请帮我解决这个问题..

2 个答案:

答案 0 :(得分:0)

您应该编写输出错误,以便我们可以看到哪个函数编写得很糟糕。在第一个视图中,我会说你应该使用更长的函数名,因为只有一个字母,它可能很容易用变量名称遮蔽,我建议不要使用全局变量。

我看到你的函数是在与主程序相同的文件中定义的,我建议每个文件创建一个函数。例如,带有以下代码的f_function m文件。

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

对其他两个功能执行相同操作,并将新创建的m文件放在与主程序相同的文件夹中。

答案 1 :(得分:0)

你是main.m是一个脚本,而不是一个函数(它不是以单词函数开头),请参阅functionScripts vs. Functions)。

简而言之:仅在函数文件中的命令行或脚本中不允许函数声明。 做oro777建议, 为每个函数创建一个单独的文件。

另一种方法是将main.m转换为函数,方法是使用function main启动它。然后在同一个文件中允许对其他函数进行解除,但这些都是本地函数,这意味着它们只能在该文件中使用。您无法从声明它们的文件外部调用它们。