为了账号安全,请及时绑定邮箱和手机立即绑定

Fipy 中的狄拉克增量源项

Fipy 中的狄拉克增量源项

万千封印 2022-06-02 15:34:27
我想知道如何将 Dirac delta 函数表示为 Fipy 中的源项。我想解决以下等式 我试过下面的代码from fipy import *nx = 50ny = 1dx = dy = 0.025  # grid spacingL = dx * nxmesh = Grid2D(dx=dx, dy=dy, nx=nx, ny=ny)phi = CellVariable(name="solution variable", mesh=mesh, value=0.)Gamma=1delta=1  # I want knowing how to make this right. eqG = TransientTerm() == DiffusionTerm(coeff=Gamma)+deltavalueTopLeft = 0valueBottomRight = 1X, Y = mesh.faceCentersfacesTopLeft = ((mesh.facesLeft & (Y > L / 2)) | (mesh.facesTop & (X < L / 2)))facesBottomRight = ((mesh.facesRight & (Y < L / 2)) |                    (mesh.facesBottom & (X > L / 2)))phi.constrain(valueTopLeft, facesTopLeft)phi.constrain(valueBottomRight, facesBottomRight)timeStepDuration = 10 * 0.9 * dx ** 2 / (2 * 0.8)steps = 100results=[]for step in range(steps):    eqG.solve(var=phi, dt=timeStepDuration)    results.append(phi.value)该代码正在运行,但我想要确切的 Dirac delta 函数。我查找了 numerix 模块,但找不到这样的功能。Sx1 和 Sy1 是常数。我正在使用 python 2.7
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

像使用扩散接口方法一样平滑 Dirac delta 函数可能是一个好主意(请参见此处的方程 11、12 和 13 )。所以,这是一种选择


def delta_func(x, epsilon):

    return ((x < epsilon) & (x > -epsilon)) * \

        (1 + numerix.cos(numerix.pi * x / epsilon)) / 2 / epsilon

2 * epsilon是狄拉克三角函数的宽度,选择为几个网格间距宽。您也可以只使用1 / dx并选择离狄拉克三角函数位置最近的网格点。但是,我认为这变得更加依赖网格。这是一维的工作代码。


from fipy import *

nx = 50

dx = dy = 0.025  # grid spacing

L = dx * nx

mesh = Grid1D(dx=dx, nx=nx)

phi = CellVariable(name="solution variable", mesh=mesh, value=0.)

Gamma=1


def delta_func(x, epsilon):

    return ((x < epsilon) & (x > -epsilon)) * \

        (1 + numerix.cos(numerix.pi * x / epsilon)) / 2 / epsilon


x0 = L / 2.

eqG = TransientTerm() == DiffusionTerm(coeff=Gamma)+ delta_func(mesh.x - x0, 2 * dx)

valueTopLeft = 0

valueBottomRight = 1


timeStepDuration = 10 * 0.9 * dx ** 2 / (2 * 0.8)

steps = 100

viewer = Viewer(phi)

for step in range(steps):

    res = eqG.solve(var=phi, dt=timeStepDuration)

    print(step)

    viewer.plot()


input('stopped')

在这里,epsilon = 2 * dx,任意选择,并且 delta 函数以 为中心L / 2。2D 只需要乘以函数。


查看完整回答
反对 回复 2022-06-02
  • 1 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号