作业帮 > 数学 > 作业

matlab中需要定义一个函数比如说是f(x,y,z),g(x,y,z)这种关于三个变量的函数,不知道怎么定义,

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:数学作业 时间:2024/05/15 00:44:38
matlab中需要定义一个函数比如说是f(x,y,z),g(x,y,z)这种关于三个变量的函数,不知道怎么定义,
做的时候需要做成网格状,x,y,z是以1为单位变化的
我现在知道液面的边界条件,就是通过给我的初始条件,能够求出网格里第一行的21个点,另外知道一个左右的边界条件,再由内部各点的条件知道各点的关系,然后求出各点的φ值,具体的题目,我可以邮件给你的.
function w=φ(x,y,z)
x=meshgrid(1:11);%11个行向量
y=meshgrid(1:21);%21个列向量
z=meshgrid(1:2);%这看成是时刻1,时刻2
t=0.0012%时刻1,时刻2
g=9.8%一个值下面会用到
h=1%一个值下面会用到
A(:,:,1)=zeros(11,21);%1时刻的φ
A(:,:,2)=zeros(11,21);%2时刻的φ
B(:,:,1)=zeros(11,21);%1时刻的u
B(:,:,2)=zeros(11,21);%2时刻的u
for(j=1:21)
A(1,j,2)-A(1,j,1)=B(1,j,1)*t
B(1,j,2)-B(1,j,1)=[A(1,j,2)-A(1,j,2)]*g*t/h%自由液面的条件
A(10,j,2)-A(11,j,2)=0%底部边界条件
end%自由液面的条件
for(i=1:11)
A(i,2,2)-A(i,1,2)=0
A(i,21,2)-A(i,20,2)=0
end%左右边界条件
for(i=1:11)
for(j=1:21)
A(i+1,j,2)-2*A(i,j,2)+A(i-1,j,2)+A(i,j+1,2)-2*A(i,j,2)+A(i,j-1,2)=0
end
end%内部各点的条件
w=A%将A(i,j,k)付值给φ(x,y,z)
matlab中需要定义一个函数比如说是f(x,y,z),g(x,y,z)这种关于三个变量的函数,不知道怎么定义,
首先确定xyz的范围,比如说xyz都是从1到10,那么
[x,y,z]=meshgrid(1:10);
这时x,y,z都是3维矩阵,因此后面无法进行乘法运算是吧.因此函数没法写.你是这个地方卡住了是吧?
可以这样解决:
x=x(:);y=y(:);z=z(:);这样将xyz变成向量.就可以像平时一样定义函数了.
再问: 谢谢你的回答,我是想把把f(x,y,z)看坐是数组 A[i,j,k],然后对这个数组在不同的i,j,k 下写出对应的关系并进行迭代,最后解出 A[i,j,k] 中各元素的值,对于这种三维数组怎么定义?
再答: 三维数组的定义是这样的: 初始化一个元素全为零的5x5x5的三维数组: A(:,:,1)=zeros(5,5);A(:,:,2)=zeros(5,5);........一直到A(:,:,5)=zeros(5,5); 如果第三维数较大,你可以用for循环来做。 你的想法我明白,但是这样编程实在太麻烦了。我不知道你的函数的具体形式。但是对于一个能显性表达的一个三元函数,你的这种用3维数组来表达一个函数的形式很难操作啊。用我的方法应该非常方便。我举个例子: 如果函数表达式是这样的w=x+y*z; 那么,新建m函数文件,取名myfun.m function w = myfun(x,y,z) % x y z 是输入参数。分别是矩阵形式的。 % 比如如下定义 [x,y,z]=meshgrid(1:10); xyz的范围和采样你可以根据自己的需要自己指定。然后通过参数传递到这个函数来。 x1=x(:);y1=y(:);z1=z(:); %xyz向量化了。x后面还有用,所以没直接改x,而是存成新变量x1. w = w=x1+y1.*z1; %向量化的xyz可以方便的表达任何函数,如果不向量化,3维矩阵的计算非常受限制。乘法是肯定不可以的。加法我忘了,好像也不可以。。但是向量化之后随便操作。 这样w也是和xyz同样尺寸的向量。但是你需要的是3维矩阵形式的。那么再进行下一步。 w=reshape(w,size(x,1),size(x,2),size(x,3)); %这个命令使w变成和x一样的3维矩阵形式。这就达到你的要求了。 完事了。希望能帮到你。不清楚你的具体要求和目的,要是还有不懂的再问吧。我觉得已经够详细了。
再问: 程序在补充问题里,不知道对不对
再答: 首先你这个程序有几个问题: 1.输入参数xyz没有用。因为你在下面重新定义了xyz。 2.另外还是像我之前说的,三维矩阵不能进行加减乘除运算。所以A(1,j,2)-A(1,j,1)=B(1,j,1)*t 这句就运行不了。(AB是三维矩阵,这个表达式matlab无法计算!),我之前让你做向量化就是为了避免这个问题的出现。如果AB都向量化了A=A(:);B=B(:),AB就会按照特定的顺序排列成一个向量,然后A(1,j,2)-A(1,j,1)=B(1,j,1)*t就可以运行了。最后得到的结果用reshape命令再重新变回原来的矩阵形式。后面的代码我就不运行了。因为这个问题肯定一直存在的。 3.看你这个程序貌似是计算液面高度的。我暂且认为你的数学建模是正确的,仅从程序上给你找问题。但是如果你对matlab不是十分熟悉,建模可能会不正确,你把你的数学模型描述给我,我给你弄吧。而且你的数学模型看起来也不复杂,应该很容易弄。
再问: 嗯,真的完全就是你所说的这种情况啊。我是对一个贮液容器液体进行一个建模的。网格划分:使用正方形网格,并对各个节点进行标记。假设分成20*10份,那么一共有21*11个节点。这些节点用φ(x,y)表示,具体的我在补充问题里面问把,如果你愿意的话,我很乐意加你成qq好友,我的q号是603404901,真的非常感谢你的帮助