level 3
5rru6t67
楼主
这个程序是利用有限元的方法求一个一维的数值积分
一般来说,网格更密的话精度更高;但在这个程序中,无论怎么修改网格数量,数值积分的结果都不会改变,想请问一下各位吧友能不能看出有什么问题,感谢感谢
程序中有设置一个衡量精度的语句,结果距离1越近表示精度越高
求解数值积分的程序
D1 = RegionUnion[Rectangle[{1, 0}, {RD, LD}]];
\[CapitalOmega] =
DiscretizeRegion[D1,
MeshRefinementFunction ->
Function[{vertices, area},
Block[{rD, zD}, {rD, zD} = Mean[vertices];
If[1 <= rD <= 1 + wD, area > 0.1, area > 1]]]]
<< NDSolve`FEM`;
{state} =
NDSolve`ProcessEquations[{D[sD[rD, zD], {rD, 2}] +
1/rD D[sD[rD, zD], {rD, 1}] == 0},
sD, {rD, zD} \[Element] \[CapitalOmega]]
Points = state["FiniteElementData"]["FEMMethodData"]["ElementMesh"];
%["Wireframe"]
Np = Length[Points[[1]]]
solE = First[
NDSolve[{D[sD[rD, zD, tD], {rD, 2}] +
1/rD D[sD[rD, zD, tD], {rD, 1}] ==
P[rD] D[sD[rD, zD, tD], {tD, 1}],
DirichletCondition[ sD[rD, zD, tD] == 1, rD == 1],
sD[rD, zD, 0] == Exp[-1000 (rD - 1)]},
sD, {tD, 0, tfD}, {rD, zD} \[Element] \[CapitalOmega],
Method -> {"FiniteElement",
"MeshOptions" -> {"MaxCellMeasure" -> 0.01}}]]
衡量精度的程序:
DsD[rD_, zD_, tD_] := D[sD[rD, zD, tD, {rD, 1}]] /. solE;
value = \[Beta]*(NIntegrate[
D[sD[rD, zD, tD] /. solE, {tD, 1}]*rD/\[Alpha], {rD, 1,
1 + wD}, {zD, 0, LD}, {tD, 0, tfD}] +
NIntegrate[
D[sD[rD, zD, tD] /. solE, {tD, 1}]*rD, {rD, 1 + wD, RD}, {zD, 0,
LD}, {tD, 0, tfD}])/
NIntegrate[DsD[rD, zD, tD] /. rD = 1, {zD, 0, LD}, {tD, 0, tfD}]
2022年02月24日 08点02分
1
一般来说,网格更密的话精度更高;但在这个程序中,无论怎么修改网格数量,数值积分的结果都不会改变,想请问一下各位吧友能不能看出有什么问题,感谢感谢
程序中有设置一个衡量精度的语句,结果距离1越近表示精度越高
求解数值积分的程序
D1 = RegionUnion[Rectangle[{1, 0}, {RD, LD}]];
\[CapitalOmega] =
DiscretizeRegion[D1,
MeshRefinementFunction ->
Function[{vertices, area},
Block[{rD, zD}, {rD, zD} = Mean[vertices];
If[1 <= rD <= 1 + wD, area > 0.1, area > 1]]]]
<< NDSolve`FEM`;
{state} =
NDSolve`ProcessEquations[{D[sD[rD, zD], {rD, 2}] +
1/rD D[sD[rD, zD], {rD, 1}] == 0},
sD, {rD, zD} \[Element] \[CapitalOmega]]
Points = state["FiniteElementData"]["FEMMethodData"]["ElementMesh"];
%["Wireframe"]
Np = Length[Points[[1]]]
solE = First[
NDSolve[{D[sD[rD, zD, tD], {rD, 2}] +
1/rD D[sD[rD, zD, tD], {rD, 1}] ==
P[rD] D[sD[rD, zD, tD], {tD, 1}],
DirichletCondition[ sD[rD, zD, tD] == 1, rD == 1],
sD[rD, zD, 0] == Exp[-1000 (rD - 1)]},
sD, {tD, 0, tfD}, {rD, zD} \[Element] \[CapitalOmega],
Method -> {"FiniteElement",
"MeshOptions" -> {"MaxCellMeasure" -> 0.01}}]]
衡量精度的程序:
DsD[rD_, zD_, tD_] := D[sD[rD, zD, tD, {rD, 1}]] /. solE;
value = \[Beta]*(NIntegrate[
D[sD[rD, zD, tD] /. solE, {tD, 1}]*rD/\[Alpha], {rD, 1,
1 + wD}, {zD, 0, LD}, {tD, 0, tfD}] +
NIntegrate[
D[sD[rD, zD, tD] /. solE, {tD, 1}]*rD, {rD, 1 + wD, RD}, {zD, 0,
LD}, {tD, 0, tfD}])/
NIntegrate[DsD[rD, zD, tD] /. rD = 1, {zD, 0, LD}, {tD, 0, tfD}]
