Скажем, у меня есть решение следующей реализации уравнения теплопроводности с использованием FiPy:
from fipy import CellVariable, FaceVariable, TransientTerm, DiffusionTerm, Grid1D
from fipy.tools import numerix
# Set Up Grid and Time Step
nx, dx = 100, 0.01
mesh = Grid1D(dx, nx)
deltaT = 0.9 * (dx**2) / 2
steps = 1000
# Construct Solution Variable
u = CellVariable('u', mesh=mesh, rank=0)
# # Set Dirchelet Boundary Conditions
u.constrain(value=0, where=mesh.facesLeft)
u.constrain(value=0, where=mesh.facesLeft)
# # Set Initial Condition
X = mesh.cellCenters[0]
gaussInit = numerix.exp(-(X-0.5)**2 / (2*0.125**2))
u.setValue(gaussInit)
# Construct PDE
eq = TransientTerm() == DiffusionTerm(coeff=1.0)
# Solve the PDE
T = np.array([0])
Solution = u.value
time = 0
time_iter = 0
while time_iter < steps:
time += deltaT
eqn.solve(dt=dt, var=u)
T = np.append(T, time)
Solution = np.vstack((Solution, u.value))
Теперь, когда у меня есть решение УЧП Solution на каждом временном шаге T, я хочу посмотреть, удовлетворяют ли эти данные УЧП. Как мне это сделать?
** Редактировать **
Рассмотрим следующий код:
eqn = (TransientTerm(coeff=rho)
+ ConvectionTerm(coeff=v)
== DiffusionTerm(coeff=D)
+ ImplicitSourceTerm(coeff=S1)
+ S0)
data = np.load('EquationSolution.npz')
t = data['t']
x_cell, x_face = data['x_cell'], data['x_face']
phi_cell, phi_face = data['phi_cell'], data['phi_face']
# _cell means cell-centered
# _face means face-centered
# phi_cell: solution at all times t and all locations x_cell
Я хочу убедиться, что мои загруженные данные решают приведенное выше уравнение eqn. Я не хочу проверять это, решая УЧП, поскольку это будет слишком дорого.
Скорее, я хочу как-то использовать eqn.residualVectorAndNorm, чтобы посмотреть, решит ли phi_celleqn. Как мне лучше всего это сделать?






В общем, вы тестируете решения, которые вам известны. В документации FiPy есть множество примеров, многие из которых проверяют аналитические решения.
Если вы не доверяете нашей дискретизации, то не следует верить остатку, поскольку они оба используют один и тот же код. Вы можете использовать Метод готовых решений, чтобы увидеть, делает ли FiPy то, что вы ожидаете. Вкратце, это включает в себя составление решения, аналитическое применение вашего уравнения к этому решению, а затем добавление этого аналитического результата к вашему уравнению в качестве источника. Вы должны получить назад готовое (изготовленное) решение (в пределах погрешности дискретизации; это способ измерения погрешности дискретизации).
Начиная с
Я хочу убедиться, что мои загруженные данные решают приведенное выше уравнение. Я не хочу проверять это, решая УЧП, поскольку это будет слишком дорого. Скорее, я хочу каким-то образом использовать eqn.residualVectorAndNorm, чтобы посмотреть, решает ли phi_cell eqn. Как мне лучше всего это сделать?
Вы загружаете старые и текущие значения, которые хотите проверить, чем-то вроде
phi_cell.value = data['phi_cell_old']
phi_cell.updateOld()
phi_cell.value = data['phi_cell']
res, resnorm = eqn.residualVectorAndNorm(var=phi, dt=dt)
Детали будут зависеть от того, что именно у вас в EquationSolution.npz.
Это позволит дискретизировать члены до полунеявной линейной матрицы, а затем явно решить , учитывая предложенное вами значение phi_cell. Затем он вернет как , так и.
Надеюсь, я не прозвучал раздраженно, когда предположил, что вы не верите в нашу дискретность. Скептицизм всегда оправдан; MMS — полезный инструмент для проверки работоспособности. Я постараюсь пересмотреть свой ответ с учетом ваших правок.
Привет @jeguyer. Что мне трудно понять, так это то, что в уравнении есть переходный член и неявные члены eqn = .... Перейдя по этой ссылке: ctcms.nist.gov/fipy/documentation/numerical/…, то есть условия phi_old для старого временного шага и phi для нового временного шага, которые необходимо решить. Фактически я хочу вычислить вектор остатков, используя свои собственные phi и phi_old. Я внесу дополнительные изменения в свой вопрос, чтобы сделать этот момент более ясным.
ХОРОШО. Я соответствующим образом исправил свой ответ. Со всем остальным лучше обращаться на github.com/usnistgov/fipy/discussions. Он лучше разбирается в математике и больше подходит для разговоров.
Спасибо за ответ @jeguyer. Это не значит, что я не доверяю вашей дискретности. Более того, я хочу использовать FiPy в проекте 4D-вариационной ассимиляции данных. Я ценю, что вы позвонили
eqn.residualVectorAndNorm. У меня есть дополнительные вопросы по этому поводу, поэтому я включу их в качестве редактирования исходного вопроса! Кроме того, я понятия не имел о методах изготовления растворов. Это также будет полезно. Огромное спасибо!