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
方程如下: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}}]]