我正在做一个项目,模拟意大利面周围的酱汁流,使用BEMLIB代码表示名为 prtcl_3d_ss_visualize.m 的stokes流,可从“http://dehesa.freeshell.org/BEMLIB/”获得。这是代码:
%---
file2 = fopen('prtcl_3d_ss_visualize.m')
Npnt = fscanf(file2,'%f',[1,1])
Nvert = fscanf(file2,'%f',[1,1])
Nface = fscanf(file2,'%f',[1,1])
vert = fscanf(file2,'%f',[3,Nvert]);
wall = fscanf(file2,'%f',[1,1])
fclose(file2)
%---
for i=1:Nvert
save = vert(2,i);
vert(2,i) = vert(3,i);
vert(3,i) = save;
end
Ic=0;
for i=1:Nface
for j=1:Npnt
Ic=Ic+1;
fac(j,i) = Ic;
end
end
patch('faces',Nfac’,'vertices',vert’,...
'FaceColor','y',...
'FaceLighting','phong',...
'BackFaceLighting','lit')
%light('Position',[1 3 2]);
%light('Position',[-3 -1 3]);
%material dull
%material shiny
%axis vis3d off
axis([-1.5 1.5 -1.5 1.5 -0.5 2.5 ])
%view(45,34)
xlabel('x')
ylabel('z')
zlabel('y')
xw(1)=-1.5; zw(1)=-1.5; yw(1)=wall;
xw(2)= 1.5; zw(2)=-1.5; yw(2)=wall;
xw(3)= 1.5; zw(3)= 1.5; yw(3)=wall;
xw(4)=-1.5; zw(4)= 1.5; yw(4)=wall;
xw(5)=-1.5; zw(5)=-1.5; yw(5)=wall;
patch(xw,zw,yw,yw);
hold off
我在matlab中输入代码时遇到了几个错误,第一个我解决了将fopen('prtcl_3d')更改为fopen('partcl_3d_ss_visualize.m')这个文件的名称。 我遇到的第二个错误是我输入
的地方patch('faces',Nfac’,'vertices',vert’,...
'FaceColor','y',...
'FaceLighting','phong',...
'BackFaceLighting','lit')
Nfac'当时正好'但是我得到了错误“???未定义的函数或变量fac”所以我把它改成了已定义的变量Nfac。
我现在遇到的问题是代码的最后一部分。当我进入第一行
xw(1)=-1.5; zw(1)=-1.5; yw(1)=wall;
我收到错误消息:“???在作业A(I)= B中,B和I中的元素数必须相同。”
我对其余的xw,zw,yw输入也得到了这个,我做错了什么?
非常感谢,
阿基勒阿基
答案 0 :(得分:0)
我解决了将fopen('prtcl_3d')更改为 fopen('partcl_3d_ss_visualize.m')这是他的档案名称。
不,你没有解决它,你打破了它。在原始脚本partcl_3d_ss_visualize.m
(或我在互联网上找到的版本,至少),我们有以下几行:
file2 = fopen('prtcl_3d.net')
Npnt = fscanf(file2,'%f',[1,1])
Nvert = fscanf(file2,'%f',[1,1])
Nface = fscanf(file2,'%f',[1,1])
vert = fscanf(file2,'%f',[3,Nvert]);
wall = fscanf(file2,'%f',[1,1])
fclose(file2)
这将打开某种数据文件prtcl_3d.net
,并加载一些必需的值(此文件可能包含在您下载的代码中的某处)。你正在做的是让脚本加载自己并尝试在文件的开头找到一些不存在的浮点数。
完成此操作后,wall
的输出很可能为空。因此,yw(1)
(1个元素)和wall
(零个元素)具有不同的大小,当您尝试将一个分配给另一个时,您会收到错误。
重要提示:之前不会出现错误,因为它能够打开文件并尝试读取内容 - 检查读入的内容是否正确是您的工作。在这种情况下,只需手动查看您的工作区就足够了。在其他情况下,可以使用isempty
,isnumeric
,size
等功能进行错误检查,具体取决于您期望的输出类型。
关于fac
/ Nfac
,我想这个脚本并不孤立,你应该在创建正确变量之前运行另一个脚本或函数。
它在该网站上说:
BEMLIB是Fortran 77的边界元素软件库(与Fortran 90兼容)和伴随C.Pozrikidis的书的Matlab代码,边界元素方法的实用指南,软件库BEMLIB,'Champan& Hall / CRC,(2002)。本书的第8-12章包含BEMLIB用户指南
我建议您需要 BEMLIB用户指南来帮助您了解代码的作用以及如何使用它,直到您明白不应对其进行任何更改。< / p>