【问题标题】:Solving PDE with Matlab用 Matlab 求解偏微分方程
【发布时间】:2015-04-16 16:58:47
【问题描述】:
`sol = pdepe(m,@ParticleDiffusionpde,@ParticleDiffusionic,@ParticleDiffusionbc,x,t);
% Extract the first solution component as u.
u = sol(:,:,:); 

function [c,f,s] = ParticleDiffusionpde(x,t,u,DuDx)
global Ds 
c = 1/Ds;
f = DuDx;
s = 0;

function u0 = ParticleDiffusionic(x)
global qo
u0 = qo;

function [pl,ql,pr,qr] = ParticleDiffusionbc(xl,ul,xr,ur,t,x)

global Ds K n
global Amo Gc kf rhop
global uavg
global dr R nr

sum = 0;
for i = 1:1:nr-1
r1 = (i-1)*dr; % radius at i
r2 = i * dr; % radius at i+1
r1 = double(r1); % convert to double precision
r2 = double(r2);
sum = sum + (dr / 2 * (r1*ul+ r2*ur));
end;
uavg = 3/R^3 * sum;

ql = 1;
pl = 0;

qr = 1;
pr = -((kf/(Ds.*rhop)).*(Amo - Gc.*uavg - ((double(ur/K)).^2).^(n/2) ));`


dq(r,t)/dt = Ds( d2q(r,t)/dr2 + (2/r)*dq(r,t)/dr )

q(r, t=0) = 0

dq(r=0, t)/dr = 0

dq(r=dp/2, t)/dr = (kf/Ds*rhop) [C(t) - Cp(at r = dp/2)]

q = solid phase concentration of trace compound in a particle with radius dp/2

C = bulk liquid concentration of trace compound

Cp = trace compound concentration at particle surface

我想用给定的初始和边界条件来解决上述 pde。尝试了 Matlab 的 pdepe,但效果不佳。也许边界条件给我带来了问题。我还使用这个等温方程来平衡:q = K*Cp^(1/n)。这是对流扩散方程,但我找不到任何可以正确解决此类方程的文章。

【问题讨论】:

  • 什么是C(t)Cp(r)?已知的、指定的函数或与q 或其他东西非线性相关?
  • 感谢您的回复。 Cp = 颗粒表面的痕量化合物浓度,即 dp/2。我认为,这取决于时间而不是 r。 C = 散装液体中痕量化合物的浓度。 Cp 与 q 相关,即 q = K*Cp^(1/n) 并且还与时间相关。还有另一个公式可用于计算 C,即:C(t) = Co (at t =0) - (mp/Vp)*qavg(t)。所以 C 和 Cp 与 q 有关。这是颗粒碳颗粒吸附痕量化合物的问题。
  • 好的。似乎pdepe 是在这种情况下使用的正确实用程序。你能发布你使用的产生不令人满意的输出的代码吗?没有MWE,我无法继续前进。
  • 我有一个无法链接的用于数据输入的 excel 文件,因此我提供了基本代码的大纲。我在想我是否可以使用crank-nicholson的有限差分法,然后在matlab而不是pdepe中求解?
  • 任何人请帮助我/指导我!

标签: matlab pde


【解决方案1】:

目前的实现有两个问题。

不正确的来源术语

您尝试求解的 PDE 具有以下形式

具有等价形式

最后一项是由于原始 PDE 中的因子 2 而出现的。 最后一个词需要通过源词并入pdepe

计算q 平均值

当前实现尝试使用传递给边界条件函数的q 的左右值来计算q 的平均值。 这是不正确的。 q 的平均值需要根据数量的最新值向量来计算。

然而,我们有一个复杂的情况是接收所有网格值的唯一函数是ParticleDiffusionpde;但是,传递给该函数的网格值不能保证来自我们提供的网格。

解决方案:使用事件(如pdepe 文档中所述)。 这是一个 hack,因为事件函数旨在检测过零,但它的优点是该函数在我们提供的网格上被赋予了 q 的所有值。

所以,下面的工作示例(您会注意到我将所有参数设置为 1,因为我不知道更好)使用 events 函数来更新可以通过以下方式访问的变量 qStore边界条件函数(see here 解释),边界条件函数执行向量化梯形积分以进行平均计算。

工作示例

function [] = ParticleDiffusion()

    %   Parameters
    Ds   = 1;
    q0   = 0;
    K    = 1;
    n    = 1;
    Amo  = 1;
    Gc   = 1;
    kf   = 1;
    rhop = 1;

    %   Space
    rMesh = linspace(0,1,10);
    rMesh = rMesh(:) ;
    dr    = rMesh(2) - rMesh(1) ; 

    %   Time
    tSpan = linspace(0,1,10);

    %   Vector to store current u-value
    qStore = zeros(size(rMesh));

    options.Events = @(m,t,x,y) events(m,t,x,y);

    %   Solve
    [sol,~,~,~,~] = pdepe(1,@ParticleDiffusionpde,@ParticleDiffusionic,@ParticleDiffusionbc,rMesh,tSpan,options);



    %   Use the events function to update qStore
    function [value,isterminal,direction] = events(m,~,~,y)
        qStore     = y; % Value of q on rMesh
        value      = m; % Since m is constant, it will never be zero (no event detection)
        isterminal = 0; % Continue integration
        direction  = 0; % Detect all zero crossings (not important)
    end


    function [c,f,s] = ParticleDiffusionpde(r,~,~,DqDr)

        %   Define the capacity, flux, and source
        c = 1/Ds;
        f = DqDr;
        s = DqDr./r;

    end

    function u0 = ParticleDiffusionic(~)
        u0 = q0;
    end

    function [pl,ql,pr,qr] = ParticleDiffusionbc(~,~,R,ur,~)

        %   Calculate average value of current solution
        qL    = qStore(1:end-1);
        qR    = qStore(2: end );
        total = sum((qL.*rMesh(1:end-1) + qR.*rMesh(2:end))) * dr/2;
        qavg  = 3/R^3 * total;

        %   Left boundary
        pl = 0;
        ql = 1;

        %   Right boundary
        qr = 1;
        pr = -(kf/(Ds.*rhop)).*(Amo - Gc.*qavg - (ur/K).^n);
    end

end

【讨论】:

  • 谢谢特洛伊!!但是给我一些时间弄清楚你在说什么,我会回复你的!如果您愿意,可以在这里留下您的电子邮件地址,以便我与您联系!!!再次感谢
  • 下标分配维度不匹配。 pdepe 错误(第 336 行)sole(:,:,i) = ye(:,i:npde:end);这是我运行您的解决方案时的错误。而且我也不明白为什么事件函数中的值等于 m
  • events 的存在纯粹是为了更新qStore。我将value 设置为等于m,因为这样就不会检测到任何事件,因为m1 的常量值(现在看这个,我应该只输入value = 1;)。 PDE 的解决方案仅在于sol,事件输出将全部为空。
  • 好的,我明白了。现在我还有两个问题/担忧:) 1. dq(r,t)/dt = Ds( d2q(r,t)/dr2 + (2/r)*dq(r,t)/dr ) ---这个方程也有另一种形式 1/Ds * dq(r,t)/dt = (1/r^2) * d/dr [ r^2 * dq(r,t)/dr ]。在这种情况下,m = 2,不需要修正源项。 2.我运行您的解决方案时的错误是“下标分配维度不匹配”。错误出现在 pdepe(第 336 行)sole(:,:,i) = ye(:,i:npde:end) 中。这是ODE15s的固有问题吗?我能做些什么来克服这个问题?
  • @NabilaFarah 好点;我忘记了球形,因为我从不使用它。关于错误(正如您最后提到的):ye 是什么,您为什么将其分配给解决方案?一旦pdepe 完成,sol(或sole 为您)中的解决方案不应更改。
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多