我的目标是在解决传热问题时应用与时间有关的热源。
瞬态传导传热的偏微分方程是:
可在此处找到更多信息:Solving a Heat Transfer Problem With Temperature-Dependent Properties
在我的情况下,所有参数都是常量,除了源项f需要随时间改变。
我按照这里的示例代码:Nonlinear Heat Transfer In a Thin Plate提供了解决瞬态问题的方法,并且我能够在每个时间点绘制热量数据。
将它应用于我的案例时的问题是,在示例中,源是整个区域和整个时间的常量值,并且与辐射和对流有关(在我的情况下,它们应该全部为零),但是我需要提供一个与时间相关的源(通过时变电流进行焦耳加热)。源可以采用以下格式之一:
并且源被限制在某个区域,例如。 0℃; x <1mm且0 < y <1 mm。
我见过类似的问题,但没有回复:How to use a variable coefficient in PDE Toolbox to solve a parabolic equation (Matlab)
有没有办法用PDE工具箱实现这个?从头开始编写代码会非常复杂......
答案 0 :(得分:3)
您可以使用this
轻松定义和解决时间相关和非线性PDE系数的问题,如下面的m脚本代码段所示。请注意,热源(接收器)术语 f 缩放为f*(t>2500)
,这意味着它仅在 t = 2500 之后才会激活(因为切换表达式评估) 0 如果为false或 1 ,如果为true)。
% Coefficents and problem definition from https://www.mathworks.com/help/pde/examples/nonlinear-heat-transfer-in-a-thin-plate.html
k=400;rho=8960;specificHeat=386;thick=.01;stefanBoltz=5.670373e-8;hCoeff=1;ta=300;emiss=.5;
% Set up 2D fea struct with geometry and grid.
fea.sdim = {'x' 'y'};
fea.geom = { gobj_rectangle( 0, 1, 0, 1 ) };
fea.grid = rectgrid( 10 );
% Add heat transfer physics mode.
fea = addphys( fea, @heattransfer );
fea.phys.ht.eqn.coef{1,end}{1} = rho*thick; % Density eqn coefficient.
fea.phys.ht.eqn.coef{2,end}{1} = specificHeat; % C_p eqn coefficient.
fea.phys.ht.eqn.coef{3,end}{1} = k*thick; % Thermal condictivity.
f = sprintf( '%g*( %g - T ) + %g*( %g^4 - T^4 )', ...
2*hCoeff, ta, 2*emiss*stefanBoltz, ta );
fea.phys.ht.eqn.coef{6,end}{1} = ['(',f,')*(t>2500)']; % Heat source term.
fea.phys.ht.bdr.sel(1) = 1; % Set prescribed temperature for boundary 1.
fea.phys.ht.bdr.coef{1,end}{1} = 1000;
fea.phys.ht.bdr.sel(2:4) = 3; % Isolation BCs for boundaries 2-4.
% Check, parse, and solve fea problem.
fea = parsephys( fea );
fea = parseprob( fea );
[fea.sol.u,t] = solvetime( fea, 'tstep', 50, 'tmax', 5000, 'init', {ta} );
% Postprocessing and visualization.
for i=1:size(fea.sol.u,2)
T_top(i) = evalexpr( 'T', [.5;1-sqrt(eps)], fea, i );
end
subplot(1,2,1)
postplot( fea, 'surfexpr', 'T', 'title', 'T @ t=5000' )
subplot(1,2,2)
plot( t, T_top, 'r-' )
xlabel( 't' )
ylabel( 'T(0.5,1) @ t=5000' )
grid on
在这里的解决方案中,您可以看到顶部边缘的温度由于从下边界的热扩散直到t = 2500,其中散热器被激活而线性上升。
关于数字源术语的第二点,在这种情况下,您可以创建并调用自己的外部函数,该函数对数据进行制表和插值,在这种情况下,它看起来像
fea.phys.ht.eqn.coef{6,end}{1} = 'my_fun( t )';
你可以在表格的Matlab路径上找到的某个Matlab函数my_fun.m
function [ val ] = my_fun( t )
data = [7 42 -100 0.1]; % Example data.
times = [0 10 99 5000]; % Time points.
val = interp1( data, times, t ); % Interpolate data.
最后,虽然这里使用m-script Matlab代码定义模型,以便在StackOverflow上共享,但您可以轻松使用Matlab FEA GUI,甚至可以根据需要将GUI模型导出为m-script代码。