Kai Liu写的这篇《An efficient 3D topology optimization code written in Matlab》,其中柔顺机构那一节的程序,我照着敲的,为什么运行出来提示
无法执行赋值,因为左侧的大小为 14385-by-1,右侧的大小为 14385-by-2。
出错 top3dmechanism (line 95)
U(freedofs,:)=K(freedofs,freedofs)\\F(freedofs,:);
看了好几遍,确实没哪个地方敲错,源程序跑悬臂梁的没问题,有没有人遇到过这个问题?
根据matlab的错误提示,我刚才把
U=U(:,1);
ce=reshape(sum((U(edofMat)*KE).*Ud(edofMat),2),[nely,nelx,nelz]);
改成
Ue=U(:,1);
ce=reshape(sum((Ue(edofMat)*KE).*Ud(edofMat),2),[nely,nelx,nelz]);
然后就算出来了,但是拓扑图有一点点的不一样,不过问题应该不大
这么做是对的吗?还是说作者那个地方写错了
xdm我还有个问题,文章中给OC法改了下增加了收敛性,我试了下原OC法确实算不出来,那么我
换个优化方法比如SQP,那么我应该怎么增加收敛性呢?
作者的代码不一定对...明显维数不一样
能跑起来就对了呗……
话说专业不一样我真的不太懂...不晓得你做的啥
收敛性的话只有改参数了呗 改步进系数?换个算法?
是line 74b弄错了,U从nx2变成了nx1。 换一个变量就行,不影响灵敏度计算。
原OC只适合全负灵敏度问题,OC用于柔顺机构的话必须用一些artifact,比如人为的把正灵敏度变成一个很小的负数,或者直接取绝对值。
据我所知,柔顺机构收敛性不是很好,建议用一些自适应的优化方法比如MMA。SQP很容易很快收敛到局部最优,其效果可能还不如MMA和OC.