可替代“evalin”用于解算器

4次观看(最近30天)
我正在使用内置的matlab 'pdepe'求解器来解决一维传热问题。我这样调用函数:
Sol = pdepe(m,@heatcyl,@heatic,@heatbc,x,t);
在哪里 是一个对称变量, x 是空间离散化吗 t 是时间离散化。边界条件函数 heatbc 初始条件函数 heatic 是固定的。然而,我的pde函数 heatcyl 具有在代码前面计算的材料属性值。函数看起来是这样的:
函数[c,f,s] = heatcyl(x,t,u, x)
w = evalin (“基地”' w ');当使用求解器时,不能将这些作为参数传入
γ= evalin (“基地”“伽马”);
C = 1;
F = dudx*gamma;
s = funcHj (x) * cos (w * t * w;
结束
作为参考,变量 w 是信号频率,和 γ 是材料的扩散系数。这些每次解算器都会改变 pdepe 被称为。pde函数还调用一个函数 funcHj
函数Hj = funcHj(x)
i_ply = evalin (“基地”“i_ply”);
ply_thickness = evalin (“基地”“ply_thickness”);
surfthick = evalin (“基地”“surfthick”);
如果(1+floor((x-surfthick)/ply_thickness)) == i_ply
Hj = 1;
其他的
Hj = 0;
结束
结束
本质上,我有一个热源,它随着材料厚度的变化而变化,这个Hj函数就是我如何确定沿着空间轴每个位置的热强迫信号。每次求解器调用pde函数时,这些值都会改变 heatcyl。
正如您所看到的,我访问了pde函数中的5个变量(w, gamma, i_ply, ply_thickness, surfthick)。使用以下命令获取这些值 Evalin 当我从基本程序调用pde时,我的工作“很好”。然而,我现在想从一个函数中调用这个求解器。Evalin('base','variable')不再工作,因为变量不再在'base'工作区中。此外,变量也不在“调用者”工作区中。(它们位于调用者的调用者的工作空间中)
为了清楚起见,这个设置是有效的:
%%启动主程序
W = [1,2,3]
Sol = pdepe(m,@heatcyl,@heatic,@heatbc,x,t);
结束
%%结束主程序
但这个没有:
%%启动主程序
加热= solve_for_frequency(freq1)
%%结束主程序
函数[foo] = solve_for_frequency(w)
Sol = pdepe(m,@heatcyl,@heatic,@heatbc,x,t);
Foo = sol(:,:,1)%提取溶液中有趣的部分
结束
在我寻找解决问题的方法时,我发现使万博 尤文图斯用 Evalin 这是不好的做法,所以我想找另一种方法来做这件事。我试过将变量保存在临时的.mat文件中,并从PDE加载它们,但我读到这并不比使用 Evalin 。此外,使用 负载 导致求解器运行的时间比使用 Evalin
我试着修改数学作业 pdepe 函数接受我的5个变量,并将它们传递给pde函数,但我没有成功。此外,我希望将我的代码包含在期刊出版物中,并且我认为会有知识产权问题阻止我共享修改过的Mathworks函数。
有没有人建议我如何将我的5个参数传递到pde函数?
多谢。

接受的答案

Stephen23
Stephen23 2021年11月7日
编辑:Stephen23 2021年11月7日
“有没有人建议我如何将我的5个参数传递给pde函数?”
推荐的、文档化的、有效的方法是参数化你的函数:
如果参数也被改变了 你所调用的函数,那么你将没有太多的选择,只能使用嵌套函数或为该数据编写一个特殊的类。但是,由于函数似乎只是使用这些参数值,因此可以使用一个简单的匿名函数,正如上面的链接所示。
W = ..;
Gamma = ..;
I_ply = .;
Ply_thickness = .;
Surfthick = .;
FNH = @(x,t,u,d) heatcyl(x,t,u,d,w, γ,i_ply,ply_thickness,surfthick);
Sol = pdepe(m,fnh,@heatic, @heatic, x,t);
地点:
函数[c,f,s] = heatcyl(x,t,u,dudx,w,gamma,i_ply,ply_thickness,surfthick)
C = 1;
F = dudx*gamma;
s = funcHj(x,i_ply,ply_thickness,surfthick)*cos(w*t)*w;
结束
函数Hj = funcHj(x,i_ply,ply_thickness,surfthick)
如果(1+floor((x-surfthick)/ply_thickness)) == i_ply
Hj = 1;
其他的
Hj = 0;
结束
结束
的内容要注意 funcHj 可以简单地替换为:
Hj = (1+floor((x-surfthick)/ply_thickness)) == i_ply;
哪个暗示最有可能 funcHj 反正是多余的:
函数[c,f,s] = heatcyl(x,t,u,dudx,w,gamma,i_ply,ply_thickness,surfthick)
C = 1;
F = dudx*gamma;
Hj = (1+floor((x-surfthick)/ply_thickness)) == i_ply;
s = Hj*cos(w*t)*w;
结束
1评论
亚历克斯·昆兰
亚历克斯·昆兰 2021年11月7日
这是辉煌的。这解决了我的参数问题,加快了我的代码,并简化了Hj函数。万分感谢!

登录评论。

更多答案(0)

类别

了解更多有关偏微分方程工具箱帮助中心文件交换

s manbetx 845


释放

R2019b

社区寻宝

在MATLAB Central中寻找宝藏,并了解社区如何帮助您!

开始狩猎!

翻译的