Я пытаюсь решить проблему тепловой диффузии на тетраэдрических конечных элементах с узловыми источниками тепла, которые зависят от вектора решения, в MATLAB. Нелинейная система уравнений выглядит следующим образом:Решение нелинейной FEM в MATLAB
В U»+ А U = Q (T)
с Б будучи capactiy матрицы тепла, А является матрицей проводимости, д быть терминами источника и U будучи температурой. Я использую схему предсказателя-корректора Adams-Bashforth/Trapezoid Rule с итерацией Пикара, за которой следует контроль по времени. Температура для исходных терминов оценивается точно между температурой последнего временного шага и температурой предсказателя. Вот упрощенная версия кода-предиктор-корректор. Вычисление источников - это функция.
% predictor
K0 = t(n)-t(n-1);
Upre(dirichlet) = u_d_t(coordinates(dirichlet,:));
Upre(FreeNodes) = U(FreeNodes,n) + (dt/2)*((2+dt/K0)*U_dt(FreeNodes,3) - (dt/K0)*U_dt(FreeNodes,1)); % predictor step
Uguess = Upre; % save as initial guess for Picard iteration
% corrector with picard iteration
while res >= picard_tolerance
T_theta = Uguess*theta + (1-theta)*U(:,n);
b = q(T_theta);
% Building right-hand side vector (without Dirichlet boundary conditions yet)
rhs = ((2/dt)*B*U(:,n) + B*U_dt(:,1))+b;
% Applying Dirichlet Boundary Conditions to the Solution Vector
Ucor(dirichlet) = u_d_t(coordinates(dirichlet,:));
rhs = rhs - ((2/dt)*B+A)*Ucor;
% Solving the linearized system using the backslash operator
% P*U(n+1) = f(Un) => U(n+1) = P\f(Un)
Ucor(FreeNodes) = ((2/dt)*B(FreeNodes,FreeNodes)+A(FreeNodes,FreeNodes))\rhs(FreeNodes);
res = norm(Uguess-Ucor);
Uguess = Ucor;
U(:,n+1) = Ucor;
end
Как вы можете видеть, я использую оператор обратной косой черты для решения системы. Нелинейность системы не должна быть плохой. Однако с увеличением временных шагов метод пикарда сходится медленнее и, в конечном итоге, перестает сходиться. Мне нужно гораздо больше времени, хотя, поэтому я поставил весь корректирующий шаг в функцию и попытался решить его с помощью fsolve, чтобы убедиться, что я добился более быстрой конвергенции. К сожалению, fsolve, похоже, никогда не заканчивает первый шаг. Я полагаю, что я не настроил параметры fsolve правильно. Может ли кто-нибудь сказать мне, как настроить fsolve для больших разреженных нелинейных систем (мы говорим о тысячах до сотен тысяч уравнений). Или может быть лучшее решение, чем fsolve для этой проблемы? Помощь и - поскольку я не специалист или инженер-вычислитель, явный совет очень ценен!