查看: 694|回复: 9|关注: 0

[已解决] 函数定义放置或嵌套错误怎么解决?

[复制链接]

新手

24 麦片

财富积分


050


18

主题

44

帖子

0

最佳答案
本帖最后由 为什么_Mp1bR 于 2020-8-22 10:15 编辑

程序大致如下,有些不必要的地方就没贴上来,请帮我看看哪里出错了,是一个子函数出现错误提示:


function shiyan13(nelx,nely,volfrac,penal,n,nx,ny)
%% 材料属性
E0 = 1;
Emin = 1e-9;
nu = 0.3;
%% 有限元
A11 = [12  3 -6 -3;  3 12  3  0; -6  3 12 -3; -3  0 -3 12];
A12 = [-6 -3  0  3; -3 -6 -3 -6;  0 -3 -6  3;  3 -6  3 -6];
B11 = [-4  3 -2  9;  3 -4 -9  4; -2 -9 -4 -3;  9  4 -3 -4];
B12 = [ 2 -3  4 -9; -3  2  9 -2;  4  9  2  3; -9 -2  3  2];
KE = 1/(1-nu^2)/24*([A11 A12;A12' A11]+nu*[B11 B12;B12' B11]);
nodenrs = reshape(1:(1+nelx)*(1+nely),1+nely,1+nelx);
edofVec = reshape(2*nodenrs(1:end-1,1:end-1)+1,nelx*nely,1);
edofMat = repmat(edofVec,1,8)+repmat([0 1 2*nely+[2 3 0 1] -2 -1],nelx*nely,1);
iK = reshape(kron(edofMat,ones(8,1))',64*nelx*nely,1);
jK = reshape(kron(edofMat,ones(1,8))',64*nelx*nely,1);
% 载荷和边界条件
F = sparse(2,1,-1,2*(nely+1)*(nelx+1),1);
U = zeros(2*(nely+1)*(nelx+1),1);
fixeddofs = union([1:2:2*(nely+1)],[2*(nelx+1)*(nely+1)]);
alldofs = [1:2*(nely+1)*(nelx+1)];
freedofs = setdiff(alldofs,fixeddofs);
%% 准备迭代
beta=1;et=0.5;
xPhys=0.5*ones(nely,nelx);        %设计变量的初始值
loop = 0;
loopbeta=0;
change = 1;
%% 开始迭代
while change > 0.01
    loop=loop+1;
    loopbeta = loopbeta + 1;
    %% 有限元求解
    sK = reshape(KE(:)*(Emin+xPhys(:)'.^penal*(E0-Emin)),64*nelx*nely,1);
    K = sparse(iK,jK,sK); K = (K+K')/2;
    U(freedofs) = K(freedofs,freedofs)\F(freedofs);
    %% 目标函数定义
    ce = reshape(sum((U(edofMat)*KE).*U(edofMat),2),nely,nelx);
    c= sum(sum((Emin+xPhys.^penal*(E0-Emin)).*ce));
    dc = -penal*(E0-Emin)*xPhys.^(penal-1).*ce;
   
    data.optimize.c=c;
    data.optimize.dc=dc;
   
    %% e04wd法求解
    ncnln = int64(1);                                   %number of nonlinear constraint
    nclin = int64(0);                                   %number of linear constraints
    LB = zeros(n,1);                                    %lower bound
    UB = zeros(n,1);                                    %upper bound
    D_right = dctmtx(nelx);
    D_left = dctmtx(nely);
    N=nelx*nely;
    Mat = zeros(N,n);
    [uM,vM] = meshgrid(0:nx-1,0:ny-1);
    for k = 0:n-1
        u = uM(k+1); v = vM(k+1);
        Mat0 = D_left(v+1,:)'*D_right(u+1,:);
        Mat0 = Mat0(:);
        LB(k+1) = sum(min(Mat0,0));
        UB(k+1) = sum(max(Mat0,0));
        Mat(:,k+1) = Mat0;
    end
    data.optimize.Mat = Mat;
    bl = [LB;0];                          %bounds for variables and constraints
    bu = [UB;volfrac];
    x0 = 0*LB;
    x0(1) = 0.5*sqrt(nelx*nely);
    A = [];                               %linear constraint
    istate = zeros(n+nclin+ncnln,1,nag_int_name);
    ccon = zeros(ncnln,1);
    cjac = zeros(ncnln,n);
    h = zeros(n);%LBFGS格式,这个参数无效
    clamda = zeros(n+nclin+ncnln,1);
    n = int64(n);
   
    %% execution NAG
    data.optimize.beta = 1;
    while true
        [majits, istate, ccon, cjac, clamda, objf, grad, h, xnew, iw, rw, data, ifail] = e04wd(A, bl, bu, @confun, @objfun, ...
            istate, ccon, cjac, clamda, h, x0, iw, rw, 'n', n, 'nclin', nclin, 'ncnln', ncnln,'user',data);%#ok
        x0 = xnew;
        data.optimize.beta = 2*data.optimize.beta;
        %     [iw, rw, ~] = e04wf('Major Optimality Tolerance = 1e-3', iw, rw);%最优解的精度,用于控制收敛条件
        [iw, rw, ~] = e04wf(['Major Iterations Limit = ',num2str(20)], iw, rw);%最大主迭代次数
        clc
        if data.optimize.beta>128
            break
        end
    end
   
   
    function [mode, objf, grad, data] = objfun(mode, n, xnew, grad, nstate, data)
    %%retrive data
    nx = data.optimize.nx;
    ny = data.optimize.ny;
    nelx = data.optimize.nelx;
    nely= data.optimize.nely;
    Mat=data.optimize.Mat;
    dc=data.optimize.dc;
    beta = data.optimize.beta;
    et = data.optimize.et;
    c=data.optimize.c;
    %%apply idct
    C = reshape(xnew,ny,nx);
    if nelx>nx && nely>ny
        C(nely,nelx) = 0;
    end
    rho = idct2(C);
    %objcetive function
    if (mode == 0 || mode == 2)
        objf = c;
    end
    %%sensitivity
    if mode == 2
        grad = zeros(1,n);
        grad_0vec = dc(:);
        grad_Pro = ProjectionTanhGrad(rho(:),beta,et);
        for k = 0:n-1
            dgdG = Mat(:,k+1).*grad_Pro;
            grad(k+1) = dgdG'*grad_0vec;
        end
    end
    end
   
   
   
    function [mode, ccon, cjac, data] = confun(mode, ncnln, n, ldcj, needc, xnew, cjac, nstate, data)
    % retrievedata
    nx = data.optimize.nx;
    ny = data.optimize.ny;
    nelx = data.optimize.nelx;
    nely = data.optimize.nely;
    beta = data.optimize.beta;
    et = data.optimize.et;
    Mat = data.optimize.Mat;
    %%
    N = nelx*nely;
    C = reshape(xnew,ny,nx);
    C(nely,nelx) = 0;
    rho = idct2(C);
    rho_bar = ProjectionTanh(rho,beta,et);
    xPhys = rho_bar;
    ccon = sum(xPhys)/N;
    grad_0 = 1/N*ones(N,1);
    if mode==2
        cjac = zeros(n,1);
        grad_Pro = ProjectionTanhGrad(rho(:),beta,et);
        for k = 0:n-1
            dgdG = Mat(:,k+1).*grad_Pro;
            cjac(k+1) = dgdG'*grad_0;
        end
    end
    end
   
   
   
   
    change = max(abs(xnew(:)-x0(:)));
    x0=xnew;
    if  beta < 128 && (loopbeta >= 30 || change <= 0.01)
        beta = 2*beta;
        loopbeta = 0;
        change=1;
        fprintf('Parameter beta increased to %g.\n',beta);
    end
    Md=sum(sum(4.*xPhys.*(1-xPhys)))./(nely.*nelx) .*100;
    %% 输出结果  
    fprintf(' It.:%5i Obj.:%11.4f Vol.:%7.3f ch.:%7.3f  Md.:%11.4f\n',loop,objf, ...
        mean(xPhys(:)),change,Md);
    %% 输出图像
    colormap(gray); imagesc(1-xPhys); caxis([0 1]); axis equal; axis off; drawnow;
end



有两个问题:

一、objfun子函数那一行提示函数定义放置或嵌套错误是怎么回事?

二、为什么好多变量的字体变蓝了?鼠标放上去会提示 变量“xxx”的作用域跨多个函数,这个有没有什么影响?

回复主题 已获打赏: 0 积分

举报

论坛优秀回答者

9

主题

1650

帖子

353

最佳答案
  • 关注者: 81
发表于 2020-8-22 10:13:49 | 显示全部楼层
请上传完整代码,至少可以在别人电脑上运行,方便查找错误,也可以更好帮助你
回复此楼 已获打赏: 0 积分

举报

新手

24 麦片

财富积分


050


18

主题

44

帖子

0

最佳答案
 楼主| 发表于 2020-8-22 10:16:19 | 显示全部楼层
20141303 发表于 2020-8-22 10:13
请上传完整代码,至少可以在别人电脑上运行,方便查找错误,也可以更好帮助你 ...

我已经改了,还请帮忙看看,谢谢
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

9

主题

1650

帖子

353

最佳答案
  • 关注者: 81
发表于 2020-8-22 10:29:13 | 显示全部楼层
仅供参考
第一问可以试试在objfun子函数前加
  1. end
复制代码

第二问是因为这个变量名在多个子函数出现,可以使用
  1. global
复制代码
声明全局变量,具体有没有影响现在并不清楚
回复此楼 已获打赏: 0 积分

举报

新手

24 麦片

财富积分


050


18

主题

44

帖子

0

最佳答案
 楼主| 发表于 2020-8-22 17:53:13 | 显示全部楼层
20141303 发表于 2020-8-22 10:29
仅供参考
第一问可以试试在objfun子函数前加
第二问是因为这个变量名在多个子函数出现,可以使用声明全局变 ...

在objfun前加end虽然没有错误提示了,但是那个end却把while循环给终止了,这样不是会造成循环时子函数没有进入循环中吗?还是说循环中只要调用子函数的那个函数在循环中就可以了?
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

9

主题

1650

帖子

353

最佳答案
  • 关注者: 81
发表于 2020-8-22 18:02:26 | 显示全部楼层
为什么_Mp1bR 发表于 2020-8-22 17:53
在objfun前加end虽然没有错误提示了,但是那个end却把while循环给终止了,这样不是会造成循环时子函数没 ...

while循环时再调用子函数,没有见过你这种循环方式
回复此楼 已获打赏: 0 积分

举报

新手

24 麦片

财富积分


050


18

主题

44

帖子

0

最佳答案
 楼主| 发表于 2020-8-22 18:18:23 | 显示全部楼层
20141303 发表于 2020-8-22 18:02
while循环时再调用子函数,没有见过你这种循环方式

意思是说我把那两个子函数放在其他文件中,然后再在这边调用是吗?
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

9

主题

1650

帖子

353

最佳答案
  • 关注者: 81
发表于 2020-8-22 18:28:54 | 显示全部楼层 |此回复为最佳答案
可以另建其他.m文件,也可在同一.m文件下,只不过每个子函数都要以end结束
回复此楼 已获打赏: 0 积分

举报

新手

24 麦片

财富积分


050


18

主题

44

帖子

0

最佳答案
 楼主| 发表于 2020-8-23 09:52:35 | 显示全部楼层
20141303 发表于 2020-8-22 18:28
可以另建其他.m文件,也可在同一.m文件下,只不过每个子函数都要以end结束

十分感谢你的回答,我去试一下
回复此楼 已获打赏: 0 积分

举报

新手

24 麦片

财富积分


050


18

主题

44

帖子

0

最佳答案
 楼主| 发表于 2020-8-23 15:30:12 | 显示全部楼层
20141303 发表于 2020-8-22 18:28
可以另建其他.m文件,也可在同一.m文件下,只不过每个子函数都要以end结束

你好,我想再问一个关于结构体的问题。首先定义一个函数:

function y=f(x)
nx = data.nx;
ny = data.ny;
y=(nx+ny)*x;
end

然后在另一个m文件中调用:

data.nx=12;
data.ny=5;
x=1;
y=f(x);

运行第二个文件会提示:未定义变量 "data" 或类 "data.nx"。
这个怎么改呢?
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表