24小时热门版块排行榜    

查看: 2277  |  回复: 19

百里道

木虫 (初入文坛)

引用回帖:
10楼: Originally posted by csgt0 at 2012-10-25 09:42:05
按你的意思我理解是对应一个(i,j),有两个速度u(i,j,1),u(i,j,2),对应8个方向,分别是w的8行,因此一个点应该计算得到8个feq
所以子函数写成function result=feq(u,rho)
其中一句改成feq(i,j,n)=w(n)*rho*(1+3*e ...

这是改过后的子函数
function result=feq(u,rho)
% double eu,uv,feq;
I=256;J=256;
N=9;
w=[4/9,1/9,1/9,1/9,1/9,1/36,1/36,1/36,1/36];
e=[0,0;1,0;0,1;-1,0;0,-1;1,1;-1,1;-1,-1;1,-1];
for i=1:I+1
    for j=1:J+1
        for n=1:N
   eu=e(n,1).*u(i,j,1)+e(n,2).*u(i,j,2);
   uv=u(i,j,1).*u(i,j,1)+u(i,j,2).*u(i,j,2);
  result=w(n)*rho*(1+3*eu+4.5*eu.*eu-1.5*uv);
        end
    end
end
现在我在主函数用 f(i,j,=feq(u,rho);调用,出现结果
??? Subscripted assignment dimension mismatch.

Error in ==> LBGK_D2Q9_liddrivenflow at 26
           f(i,j,=feq(u,rho);

怎么才能解决这个问题?十分感谢帮我看这个问题
==
11楼2012-10-26 09:28:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

csgt0

荣誉版主 (著名写手)

彩色挂图

【答案】应助回帖

你没有看我给你写的啊
feq(i,j,n)=w(n)*rho*(1+3*eu+4.5*eu.*eu-1.5*uv);
然后主函数里就用
r=result(u,rho)
这样就把所有的算完了。
另外你一会儿用result=feq(),一会儿用feq=result()
一会儿要在子程序算所有的,一会儿要在子程序算一个而在主程序算所有的
不知道你到底想要算什么
showmethemoney
12楼2012-10-26 09:37:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

百里道

木虫 (初入文坛)

你改写的是子程序算所有的,按照子程序算一个主程序算所有的怎么写?

在我的主程序中,后面还要用到feq(I+1,j,n);feq(1,J,n)还有几个点处的值,所以我觉得是子程序算一个值,谢谢!
==
13楼2012-10-26 10:55:49
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

百里道

木虫 (初入文坛)

引用回帖:
12楼: Originally posted by csgt0 at 2012-10-26 09:37:34
你没有看我给你写的啊
feq(i,j,n)=w(n)*rho*(1+3*eu+4.5*eu.*eu-1.5*uv);
然后主函数里就用
r=result(u,rho)
这样就把所有的算完了。
另外你一会儿用result=feq(),一会儿用feq=result()
一会儿要在子程序算所 ...

将原程序改为
for i=1:I+1
    for j=1:J+1
        u(i,j,1)=0;u(i,j,2)=0;
        rho(i,j)=rho0;
        u(i,J+1)=U;
    end
end
for n=1:N
    f(:,:,n)=result(u,rho);
end
。。。。

function feq=result(u,rho)
N=9;
w=[4/9,1/9,1/9,1/9,1/9,1/36,1/36,1/36,1/36];
e=[0,0;1,0;0,1;-1,0;0,-1;1,1;-1,1;-1,-1;1,-1];

for n=1:N
   eu=e(n,1).*u(:,:,1)+e(n,2).*u(:,:,2);
   uv=u(:,:,1).*u(:,:,1)+u(:,:,2).*u(:,:,2);
   feq=w(n)*rho*(1+3*eu+4.5*eu.*eu-1.5*uv);
end
将不会出现原来的错误提示,但是主程序部分出现新的问题:
for i=2:I
    for j=2:J
        for n=1:N
          ip=i-e(n,1);
          jp=j-e(n,2);
          F(i,j,n)=f(ip,jp,n)+(result(u(ip,jp),rho(ip,jp))-f(ip,jp,n))/tau;
        end
    end
end
因为我要算出(ip,jp)处的feq,按上面的写会提示出现错误如下:
??? Index exceeds matrix dimensions.

Error in ==> LBGK_D2Q9_liddrivenflow>result at 88
   eu=e(n,1).*u(:,:,1)+e(n,2).*u(:,:,2);

Error in ==> LBGK_D2Q9_liddrivenflow at 37
          F(i,j,n)=f(ip,jp,n)+(result(u(ip,jp),rho(ip,jp))-f(ip,jp,n))/tau;

不知道该怎么改了,请看一下怎么改
==
14楼2012-10-26 15:08:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

csgt0

荣誉版主 (著名写手)

彩色挂图

【答案】应助回帖

★ ★ ★ ★ ★
百里道: 金币+5, ★★★很有帮助 2012-10-30 14:18:51
子程序写算一个点的值那么就用一个点的坐标传进去就行,不用把整个的u都传进去
function feq=result(p,rho1)
N=9;
w=[4/9,1/9,1/9,1/9,1/9,1/36,1/36,1/36,1/36];
e=[0,0;1,0;0,1;-1,0;0,-1;1,1;-1,1;-1,-1;1,-1];
for n=1:N
    eu=e(n,1)*p(1)+e(n,2)*p(2);
    uv=p(1)^2+p(2)^2;
    feq(n)=w(n)*rho1*(1+3*eu+4.5*eu.*eu-1.5*uv);
end

主程序里面对于第(i,j)点就用
p=[u(i,j,1),u(i,j,2)];
rho1=rho(i,j);
feq(i,j,=result(p,rho1);
showmethemoney
15楼2012-10-26 15:33:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

百里道

木虫 (初入文坛)

百里道: 回帖置顶 2012-10-28 08:52:42
引用回帖:
15楼: Originally posted by csgt0 at 2012-10-26 15:33:25
子程序写算一个点的值那么就用一个点的坐标传进去就行,不用把整个的u都传进去
function feq=result(p,rho1)
N=9;
w=;
e=;
for n=1:N
    eu=e(n,1)*p(1)+e(n,2)*p(2);
    uv=p(1)^2+p(2)^2;
    feq( ...

按上面你说的可不可以认为feq在子程序只与n有关,所以在主程序调用的时候都要写成feq(i,j,,而不是feq(i,j,n)?
可是这样的胡,后面的程序
for i=2:I
    for j=2:J
        for n=1:N
          ip=i-e(n,1);
          jp=j-e(n,2);
          p=[u(ip,jp,1),u(ip,jp,2)];
          rho1=rho(ip,jp);
          F(i,j,=f(ip,jp,+(result(p,rho1)-f(ip,jp,)/tau;
        end
    end
end
运行后会出现
??? Error using ==> minus
Matrix dimensions must agree.

Error in ==> LBGK_D2Q9_liddrivenflow at 44
          F(i,j,=f(ip,jp,+(result(p,rho1)-f(ip,jp,)/tau;

提示矩阵维数不一致,是不是说f(i,j,n)是三维的,而调用的feq(n)是一维的,这样的话怎么把feq变为三维数组?
不知道我的理解对不对?怎么样才能把feq变成三维数组?

还有一个问题,如果把主程序的这部分改为
for i=2:I
    for j=2:J
        for n=1:N
          ip=i-e(n,1);
          jp=j-e(n,2);
          p=[u(ip,jp,1),u(ip,jp,2)];
          rho1=rho(ip,jp);
          F(i,j,n)=f(ip,jp,n)+(result(p,rho1)-f(ip,jp,n))/tau;
        end
    end
end
提示出现错误
??? Assignment has more non-singleton rhs dimensions than non-singleton
subscripts

Error in ==> LBGK_D2Q9_liddrivenflow at 44
          F(i,j,n)=f(ip,jp,n)+(result(p,rho1)-f(ip,jp,n))/tau;

这句是什么意思?
==
16楼2012-10-27 09:53:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

csgt0

荣誉版主 (著名写手)

彩色挂图

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★
百里道: 金币+9, ★★★很有帮助 2012-10-31 15:32:12
这是你的三维矩阵维度的问题,
result(p,rho1)算出来的是一个行向量,放到三维矩阵中应该是用A=(i,:,j)来表示的
所以你跟他加减的项应该也是这样的,为了方便一般都用列向量放第一个最方便。
另外你这一句的问题,F(i,j,n),f(ip,jp,n)都是一个数,而result(p,rho1)是一列数,你把一列数赋值给一个数当然报错。
F(i,j,n)=f(ip,jp,n)+(result(p,rho1)-f(ip,jp,n))/tau;
最好的方法是
CODE:
F(:,i,j)=f(:,ip,jp)+(result(p,rho1)'-f(:,ip,jp))/tau;

其中把你的计算结果按列排放就好了。result这个转置可以在子程序里做就可以了。

作为测试,你试试以下程序就明白了
[code]
t1=1:5;
t2=t1';
A1(6,7,=t1;   %t1各元素分别对应每层的(6,6)元素
A2(6,:,7)=t1;   %t1各元素对应第7层的第6行
A3(:,6,7)=t2;   %t2各元素对应第7层的第6列

A1(6,7,-t1   %报错,三维矩阵第3个指数不能直接跟行列向量计算
A2(6,:,7)-t1  %不报错,A2第7层第6行减去行向量t1
A2(:,5,7)-t1  %报错,A2第7层第5列是列向量,不能减去行向量t1
A2(:,5,7)-t2  %报错,A2第7层第5列是列向量,但是有6行,不能减去5行的t2
A2(1:5,5,7)-t2  %不报错,A2第7层第5列是列向量,但是有6行,取前5行可以减去5行的t2
A3(:,6,7)-t2  %不报错
A3(5,:,7)-t2  %报错,A3第7层第5行为6的行向量,t2为列向量,长度不同
A3(5,1:5,7)-t2  %报错,改为长度相同,但是一个行向量,一个列向量,不能减
[code]
showmethemoney
17楼2012-10-30 17:17:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

百里道

木虫 (初入文坛)

引用回帖:
17楼: Originally posted by csgt0 at 2012-10-30 17:17:09
这是你的三维矩阵维度的问题,
result(p,rho1)算出来的是一个行向量,放到三维矩阵中应该是用A=(i,:,j)来表示的
所以你跟他加减的项应该也是这样的,为了方便一般都用列向量放第一个最方便。
另外你这一句的问题 ...

非常感谢,不知道怎么才是按列排放,我只好定义了f=zeros(N,I+1,J+1),再没有出现问题
另外,我想请教函数调用的问题
对于下式
f(I+1,j,n)=feq(I+1,j,n)+f(I,j,n)-feq(I,j,n)
(feq只是说明坐标)一个式子里出现两次要调用的函数result,按照你前面所说的
主程序里面对于第(i,j)点就用
p=[u(i,j,1),u(i,j,2)];
rho1=rho(i,j);
feq(i,j,:)=result(p,rho1);

所以我写成
     p2=[u(1,I+1,j),u(2,I+1,j)];
     rho2=rho(I+1,j);
     r2=result(p2,rho2);
     
     p3=[u(1,I,j),u(2,I,j)];
     rho3=rho(I,j);
     r3=result(p3,rho3);
     
     f(n,I+1,j)=r2(n)+f(n,I,j)-r3(n);


可以运行程序,不过要求的feq的点比较多,所以这个过程很长,有没有简单的办法调用?
==
18楼2012-10-31 16:21:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

csgt0

荣誉版主 (著名写手)

彩色挂图

【答案】应助回帖


百里道: 金币+1, ★★★★★最佳答案 2012-10-31 21:34:20
在result函数里最后用一下转置,然后主程序对i和j循环使用下式,就可以把每个(i,j)对应的n个f都算出来
CODE:
f(:,i+1,j)=result([u(i+1,j,1),u(i+1,j,2)],rho(i+1,j))+f(:,i,j)-result([u(i,j,1),u(i,j,2)],rho(i,j));

showmethemoney
19楼2012-10-31 17:38:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

百里道

木虫 (初入文坛)

引用回帖:
19楼: Originally posted by csgt0 at 2012-10-31 17:38:51
在result函数里最后用一下转置,然后主程序对i和j循环使用下式,就可以把每个(i,j)对应的n个f都算出来

f(:,i+1,j)=result(,rho(i+1,j))+f(:,i,j)-result(,rho(i,j));
...

谢谢!
==
20楼2012-10-31 21:33:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 百里道 的主题更新
信息提示
请填处理意见