我尝试用MATLAB中的节点热源解决四面体有限元上的热扩散问题,这取决于解向量。非线性方程系统如下所示:
乙 U' + A U = q(T)
B是热容矩阵,A是电导率矩阵,q是源项,U是温度。我使用Adams-Bashforth / Trapezoid Rule预测器 - 校正器方案,Picard迭代后跟时间步长控制。源项的温度精确地在最后时间步骤的温度和预测器的温度之间进行评估。这是预测器 - 校正器代码的简化版本。源的计算是一个函数。
% 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
如您所见,我使用反斜杠运算符来解决系统问题。系统的非线性不应该是坏的。然而,随着时间步长的增加,picard方法收敛得更慢并最终停止收敛。我需要更大的时间步骤,所以我将整个校正器步骤放入一个函数中并试图用fsolve解决它,看看我是否实现了更快的收敛。不幸的是,fsolve似乎从来没有完成第一次。我想我没有正确配置fsolve的选项。任何人都可以告诉我,如何为大型稀疏非线性系统配置fsolve(我们正在讨论数千到数十万个方程)。或者对于这个问题,是否有比fsolve更好的解决方案?帮助和 - 因为我不是专家或计算工程师 - 非常感谢明确的建议!
答案 0 :(得分:0)
根据我的经验,通过线性化来求解非线性方程以求解温度增量并使用类似Newton Raphson求解器的方法迭代到收敛。因此,如果您正在使用隐式集成模式,那么您将拥有一个外部时间步骤解决方案,该解决方案具有针对整个时间步骤的温度步长的内部非线性解决方案。