|
|

楼主 |
发表于 2025-8-19 23:36
|
显示全部楼层
本帖最后由 永远 于 2025-8-20 00:15 编辑
对11楼程序得到的当 a=46.4483021270782…… 误差函数在区间内最大值为: 0.00001872118423551505
首先用老程序验证一番:
- NumberForm[N[NMaximize[{Abs[Hypergeometric2F1[-(1/2), -(1/2), 1, x^2] -
- (1 + (3 x^2)/(
- 10 + Sqrt[
- 4 - 3 x^2])) (1 + (22/(7 \[Pi]) - 1) ((2 x)/(1 + x))^
- 46.4483021270782)], 0 < x < 1}, x]], 10]
复制代码
咋一看,似乎感觉没啥问题,事实上对于NMaximize/NMinimize虽然是全局极值求解器,当计算非线性问题时依旧可能找错位置,这在自带帮助的“更多信息和选项”部分是明确说了的。
没想到这事居然被我遇见了 ,还别说误差函数在在区间内有2个极大值点,而NMaximize返回给我的是最小的点
继续对上面的程序加强优化:
- ClearAll["Global`*"]
- G[\[Lambda]_] := Hypergeometric2F1[-1/2, -1/2, 1, \[Lambda]^2]
- c = 22/(7 \[Pi]) - 1;
- a = 46.4483021270782`50;
- F[\[Lambda]_,
- a_] := (1 + (3 \[Lambda]^2)/(10 + Sqrt[4 - 3 \[Lambda]^2]))*(1 +
- c*(2 \[Lambda]/(1 + \[Lambda]))^a)
- error[\[Lambda]_] := Abs[G[\[Lambda]] - F[\[Lambda], a]];
- obj[\[Lambda]_] = (G[\[Lambda]] - F[\[Lambda], a])^2;
- crit = \[Lambda] /.
- NSolve[{D[obj[\[Lambda]], \[Lambda]] == 0,
- 0 <= \[Lambda] <= 1}, \[Lambda], Reals, WorkingPrecision -> 30];
- errorAtCrit = error /@ crit;
- Transpose[{crit, errorAtCrit}] // Select[#, #[[2]] > 10^-6 &] & //
- Grid[#, Frame -> All] &
- Plot[error[\[Lambda]], {\[Lambda], 0, 1}, PlotRange -> All]
复制代码
继续对上面的最大值验证程序优化:
- ClearAll["Global`*"]
- c = 22/(7 \[Pi]) - 1;
- a = 46.4483021270782`100;
- G[\[Lambda]_] = Hypergeometric2F1[-1/2, -1/2, 1, \[Lambda]^2];
- F[\[Lambda]_] = (1 + (3 \[Lambda]^2)/(10 +
- Sqrt[4 - 3 \[Lambda]^2]))*(1 +
- c*(2 \[Lambda]/(1 + \[Lambda]))^a);
- Error[\[Lambda]_] = Abs[F[\[Lambda]] - G[\[Lambda]]];
- (*全局搜索:正确写法*)
- res = NMaximize[{Error[\[Lambda]], 0 <= \[Lambda] <= 1}, \[Lambda],
- Method -> {"DifferentialEvolution", "SearchPoints" -> 30,
- "RandomSeed" -> 1234},
- MaxIterations -> 500,(* \[LeftArrow]放在 Method 外面*)
- WorkingPrecision -> 50];
- (*正确提取*)
- maxVal = res[[1]];
- maxPos = \[Lambda] /. res[[2]];
- {maxVal, maxPos} // N[#, 30] &
- Plot[Error[\[Lambda]], {\[Lambda], 0, 1}, PlotRange -> All,
- Frame -> True, FrameLabel -> {"\[Lambda]", "|F - G|"},
- PlotLabel ->
- "Error |F(\[Lambda],a)-G(\[Lambda])|\n" <> "Max = " <>
- ToString@N[maxVal, 10] <> " at \[Lambda] = " <>
- ToString@N[maxPos, 10],
- Epilog -> {Red, PointSize[Large], Point[{maxPos, maxVal}]},
- ImageSize -> 500]
复制代码
综上:
所以当 a=46.4483021270782……时,误差函数在 λ=0.98704513088618…… 取最大值0.0000188768114766472……
而对于11楼,误差函数在 λ= 0.898055159455627…… 误差函数值0.00001872118423551505…… 显然不是最大值点。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|