求助,mathematica数值求解一阶常复系数微分方程组
mathematica吧
全部回复
仅看楼主
level 2
想要使用mathematica做一些数值求解偏微分方程组的东西,因此先随便使用一个方程去做测试。
方程如下:n[i]·Grad[u[i]]==Σ_{j} M[i][j]*u[j]
n为单位矢量矩阵,我将其分量限制为全正数;M为复常数矩阵,将其设置为模值为1。i,j∈{1,2,...,num}
但有一些问题:
1,有结果不稳定的问题,这个原因不知为何,是否会影响正确性,我应该怎么检验其影响大小,又应该如何优化之,使此警报消失?
2,运行的时候,CPU占用还比较多,但是我运行之时有时会突然停止运行,然后整个文档的变量被重置,需要从头运行文档,什么错误都不报直接崩溃,这可能是什么原因呢?我的计算的参数内核啥的都没有动过,都是安装好之后的设置,不知有没有什么可以优化的。
3,网格最大为0.001,看示意图,是说的体积,难道就1000个点就让mathematica算的汗流浃背了吗?这完全达不到我待求问题的精度啊。可以怎么优化啊?
下图是方程具体形式:
下图是试运行的u1作图结果:
以下是全代码
(*1:生成方向向量,num为待求因变量的个数*)
num = 6;
Clear[randomUnitVector3D1];
randomUnitVector3D1[n_] :=
Abs[Table[Normalize@RandomVariate[NormalDistribution[], 3], {n}]]
vectors = randomUnitVector3D1[num](*生成num个单位三维向量*);
(*生成一个系数矩阵*)
Clear[randomUnitComplex];
randomUnitComplex[n_] :=
Table[Table[Exp[I RandomReal[{0, 2 Pi}]], {n}], {n}]
matrix = randomUnitComplex[num](*要生成的矩阵的维数为num*);
(*2:生成方程*)
funcLeft =
Table[Grad[Symbol["u" <> ToString[i]][x, y, z], {x, y, z}] .
vectors[[1]], {i, 1, num}];(*方程左侧*)
funcRight =
matrix. Table[Symbol["u" <> ToString[i]][x, y, z], {i, 1, num}];(*方程右侧*)
fcD = Table[
Grad[Symbol["u" <> ToString[i]][x, y, z], {x, y, z}], {i, 1,
num}];
fc = Table[Symbol["u" <> ToString[i]], {i, 1, num}];(*因变量*)
equns = Table[funcLeft[[i]] == funcRight[[i]], {i, 1, num}];(*方程*)
(*3:生成边界条件*)
xlim = 1; ylim = 1; zlim = 1;
Subscript[\[CapitalGamma], D] =
Join[{DirichletCondition[u1[x, y, z] == Exp[-(x^2 + y^2)/0.5],
z == 0]},
Table[DirichletCondition[Symbol["u" <> ToString[i]][x, y, z] == 0,
z == 0], {i, 2, num}]];
(*4:生成网格*)
mesh = ToElementMesh[Cuboid[{0, 0, 0}, {xlim, ylim, zlim}],
"MaxCellMeasure" -> 0.001];
(*5:计算*)
ufun = NDSolveValue[Join[equns, Subscript[\[CapitalGamma], D]],
fc, {x, y, z} \[Element] mesh]
(*6:做图*)
DensityPlot3D[Abs[ufun[[1]][x, y, z]], {x, y, z} \[Element] mesh,
PlotRange -> All, AxesLabel -> Automatic,
ColorFunction -> "TemperatureMap",
PlotLegends -> BarLegend[{"TemperatureMap", {0, 1}}]]
2024年01月31日 02点01分 1
level 2
之前并未用mathematica求解微分方程,这次是看着帮助文档写出来的,很多参数都没有调,如果大家知道我这里有什么代码上的错误,或有明显的浪费了资源,还请指出。[泪]
2024年01月31日 02点01分 2
或者根本的,方程实现的方法或者思路[泪]用错了
2024年01月31日 02点01分
level 2
代码开头少了一行:
Needs["NDSolve`FEM`"]
2024年01月31日 06点01分 4
吧务
level 15
“先随便使用一个方程”——你这就是取死之道,在进行PDE相关的测试时,应该使用已经经过充分检验的经典问题进行测试,而不是自己随便构造,因为这极易产生
看似简单实则困难的、甚至是
病态的问题
。你构造的这方程就是如此,如警告信息所说,这个方程组“以传送为主导(convection-dominated)”,因为它是个纯一阶的方程,此类方程的解——粗略地说——往往非常硬。事实上,目前NDSolve的有限元方法对此的策略似乎是,只要检测到了纯一阶的维度,NDSolve就必跳此警告(即便解其实没问题),一个极端的例子:
NDSolveValue[{u'[x] == 1, u[0] == 0}, u, {x, 0, 1}, Method -> "FiniteElement"]
(* 解其实是对的,但是还是跳了警告 *)
但是高维的一阶方程往往没这么温柔,你随便造的这个方程组会算崩没什么不可思议的。文档《Solving Memory-Intensive PDEs》(FEMDocumentation/tutorial/FiniteElementBestPractice#1100428117)或许能在一定程度上改善此问题,但是你现在的首要任务,是选一个更好的测试用例。
2024年02月03日 04点02分 5
谢谢指教,在pde方程求解里面确实听说过要找有解的方程,应该是学艺不精了。我真实需要求解的方程也是一阶形式,是从电动力学出发的方程组。 我试试直接求解我的方程
2024年02月03日 09点02分
1