Убедитесь, что решение удовлетворяет PDE: FiPy

Скажем, у меня есть решение следующей реализации уравнения теплопроводности с использованием 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. Как мне лучше всего это сделать?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В общем, вы тестируете решения, которые вам известны. В документации FiPy есть множество примеров, многие из которых проверяют аналитические решения.

Если вы вызываете eqn.sweep() вместо eqn.solve() , он возвращает остаток, который является мерой того, насколько хорошо решение удовлетворяет уравнению. Я отмечаю, что документация неверна; он не возвращает вектор невязки, он возвращает L2-норму вектора невязки: , где L — линеаризованная матрица дискретизации УЧП, x — вектор решения, а b — правая часть уравнения (из-за граничных условий, источников и «старых» значений). Обратите внимание, что невязка оценивается до решения уравнения; после решения уравнения остаток будет таким же, как и допуск линейного решателя, но он не обязательно будет хорошим решением нелинейного УЧП. Если у вас есть нелинейные коэффициенты, остаток должен уменьшаться по мере многократного анализа уравнения. Для вашего примера с постоянными коэффициентами вы можете выполнить проверку второй раз (или вызвать eqn.residualVectorAndNorm()).

Если вы не доверяете нашей дискретизации, то не следует верить остатку, поскольку они оба используют один и тот же код. Вы можете использовать Метод готовых решений, чтобы увидеть, делает ли FiPy то, что вы ожидаете. Вкратце, это включает в себя составление решения, аналитическое применение вашего уравнения к этому решению, а затем добавление этого аналитического результата к вашему уравнению в качестве источника. Вы должны получить назад готовое (изготовленное) решение (в пределах погрешности дискретизации; это способ измерения погрешности дискретизации).

Редактировать в ответ на Edited Edit

Начиная с

Я хочу убедиться, что мои загруженные данные решают приведенное выше уравнение. Я не хочу проверять это, решая УЧП, поскольку это будет слишком дорого. Скорее, я хочу каким-то образом использовать 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. Затем он вернет как , так и.

Спасибо за ответ @jeguyer. Это не значит, что я не доверяю вашей дискретности. Более того, я хочу использовать FiPy в проекте 4D-вариационной ассимиляции данных. Я ценю, что вы позвонили eqn.residualVectorAndNorm. У меня есть дополнительные вопросы по этому поводу, поэтому я включу их в качестве редактирования исходного вопроса! Кроме того, я понятия не имел о методах изготовления растворов. Это также будет полезно. Огромное спасибо!

user3166083 29.05.2024 22:57

Надеюсь, я не прозвучал раздраженно, когда предположил, что вы не верите в нашу дискретность. Скептицизм всегда оправдан; MMS — полезный инструмент для проверки работоспособности. Я постараюсь пересмотреть свой ответ с учетом ваших правок.

jeguyer 30.05.2024 05:08

Привет @jeguyer. Что мне трудно понять, так это то, что в уравнении есть переходный член и неявные члены eqn = .... Перейдя по этой ссылке: ctcms.nist.gov/fipy/documentation/numerical/…, то есть условия phi_old для старого временного шага и phi для нового временного шага, которые необходимо решить. Фактически я хочу вычислить вектор остатков, используя свои собственные phi и phi_old. Я внесу дополнительные изменения в свой вопрос, чтобы сделать этот момент более ясным.

user3166083 31.05.2024 15:52

ХОРОШО. Я соответствующим образом исправил свой ответ. Со всем остальным лучше обращаться на github.com/usnistgov/fipy/discussions. Он лучше разбирается в математике и больше подходит для разговоров.

jeguyer 31.05.2024 16:36

Другие вопросы по теме

Похожие вопросы

Ошибка AttributeError: объект «DataFrame» не имеет атрибута «append», попробовал pd.concat, но также вызвал ошибку
Ошибка типа при создании пользовательского набора данных с использованием набора данных HuggingFace
Существует ли в Python f-строка, эквивалентная std::quoted в C++?
Selenium — TypeError: невозможно создать экземпляр абстрактного класса Service без реализации абстрактного метода «command_line_args»
Поскольку запросы == 2.32.2 получили SSL/сертификат, проверка не удалась: самозаверяющий сертификат при использовании python-keycloak
Наименьший_квадрат неточен в химическом виде
Python Fernet шифрует и дешифрует проблему с байтами
Как получить доступ к виджету вкладок ttk.Notebook?
Pandas ExcelWriter не закрывается должным образом, что приводит к нарушениям совместного использования при последующем редактировании Excel
Как распечатать значения текстового поля Флета, добавленные на страницу с помощью цикла for?