网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月03日漏签0天
mathematica吧 关注:19,920贴子:74,196
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 36回复贴,共1页
<<返回mathematica吧
>0< 加载中...

函数逼近求最佳a值。

  • 只看楼主
  • 收藏

  • 回复
  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

代码:
(*常数*)c = 22/(7 \[Pi]) - 1;
(*函数*)
G[\[Lambda]_] = Hypergeometric2F1[-1/2, -1/2, 1, \[Lambda]^2];
F[\[Lambda]_,
a_] = (1 + (3 \[Lambda]^2)/(10 + Sqrt[4 - 3 \[Lambda]^2]))*(1 +
c*(2 \[Lambda]/(1 + \[Lambda]))^a);
(*离散化 \[Lambda] 区间*)
\[Lambda]Grid =
Subdivide[0.001, 0.999, 1000];(*避开端点 0 和 1*)(*最大绝对误差(离散版)*)
maxError[a_?NumericQ] := Max[Abs[F[#, a] - G[#]] & /@ \[Lambda]Grid];
(*最小化最大误差*)
{minMaxError, bestA} =
NMinimize[{maxError[a], 0 < a < 100}, a,
Method -> "DifferentialEvolution"];
(*结果*)
bestAValue = a /. bestA;
Print["最小化最大误差的最佳 a \[TildeTilde] ", bestAValue,
", 最大误差 \[TildeTilde] ", minMaxError];
(*验证*)
Plot[{G[\[Lambda]], F[\[Lambda], bestAValue]}, {\[Lambda], 0, 1},
PlotStyle -> {Blue, {Red, Dashed}},
PlotLegends -> {"G(\[Lambda])", "F(\[Lambda], a)"},
PlotLabel -> "最小化最大误差下的逼近效果"]


  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼上代码运行后得:最小化最大误差的最佳 a=46.4826……
可实际上a=46.449……
另外楼上代码运行有点卡,不知道怎么改代码使之运行快一点?
以上情况还望前辈们指导一二。


2025-12-03 09:55:42
广告
不感兴趣
开通SVIP免广告
  • 王皮尔磁子
  • 还未摆脱
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
ClearAll["`*"];
c = 22/(7 \[Pi]) - 1;
G[\[Lambda]_] := Hypergeometric2F1[-1/2, -1/2, 1, \[Lambda]^2];
F[\[Lambda]_,
a_] := (1 + (3 \[Lambda]^2)/(10 + Sqrt[4 - 3 \[Lambda]^2]))*(1 +
c*(2 \[Lambda]/(1 + \[Lambda]))^a);
something[a_?NumericQ] :=
NMaxValue[{Abs[G[\[Lambda]] - F[\[Lambda], a]],
0 <= \[Lambda] < 1}, \[Lambda]];
data1 = ParallelMap[{#, something[#]} &, Range[0, 100, 0.5]];

从粗糙的数据data1中得出极小值点在46和47之间
ListPlot@data1
MinimalBy[data1, Last, 4]
然后再使用
NMinimize[{something[a], 46 <= a <= 47}, a]
得出a.
这个NMinimize需要花费较长时间, 我想是因为函数之差的绝对值something疑似是不连续的
ListPlot[
ParallelMap[{#, something[#]} &, Range[46.446, 46.450, 0.00005]],
PlotRange -> All]

不知道是什么原因.


  • hjq447285628
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
按照你对maxError的定义,确实是在a=46.4826取到最小值,不知道你认为“实际上a=46.449”的理由是什么
要加速代码,只需要用内置函数拟合即可
(*前面到\[Lambda]Grid的定义为止都是一样的*)
bestA=FindFit[{#,G@#}&/@\[Lambda]Grid,F[\[Lambda],a],a,\[Lambda],NormFunction->(Norm[#,Infinity]&)]
这里将NormFunction选项设定为无穷范数,指定优化目标为最小化最大误差,不带参数的情况下,FindFit默认是求最佳的最小平方拟合


  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
主贴问题已解决:
苦战了几个夜晚,终于锁定最佳 a 值,用Mathematica 编程得到的值与自己先前预测值完美一致!!!
最佳 a=46.4483021270782……
最小化最大误差值为: 0.00001872118423551505……
最优 λ 值为: 0.898055159455627……


  • xzcyr
  • 吧主
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
而且你6楼算出来的也不是最优值,当a取你说的值时,误差函数的极值应该在0.987附近:
avalue = 46.4483021270782;
N[With[{\[Lambda] = Rationalize[0.987097692805233`, 0]},
Abs[F[\[Lambda], Rationalize[avalue, 0]] - G[\[Lambda]]]], 16]
此时的误差最大值为0.00001887665275933527。至于我咋算出来的嘛,我不告诉你。


  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用Mathematica检验所求的最大误差值是不是最小值:
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]


2025-12-03 09:49:42
广告
不感兴趣
开通SVIP免广告
  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
特别的,当a≈46.4484 误差=0.00001872138763348019
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.4484)], 0 < x < 1}, x]], 10]


  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
从图片上显示误差
a=46.4826,误差=0.000018792507331166775`
a=46.4484,误差=0.00001872138763348019


  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
a=46.4483021270782……
代码:
(*目标函数 G(\[Lambda])*)
G[\[Lambda]_] := HypergeometricPFQ[{-1/2, -1/2}, {1}, \[Lambda]^2];
(*逼近函数 F(\[Lambda],a)*)
F[\[Lambda]_,
a_] := (1 + (3 \[Lambda]^2)/(10 +
Sqrt[4 - 3 \[Lambda]^2]))*(1 + (22/(7 \[Pi]) -
1) (2 \[Lambda]/(1 + \[Lambda]))^a);
(*定义绝对误差函数*)
error[\[Lambda]_, a_] := Abs[F[\[Lambda], a] - G[\[Lambda]]];
(*计算给定 a 值时的最大绝对误差*)
maxError[a_?NumericQ] :=
NMaximize[{error[\[Lambda], a], 0 < \[Lambda] < 1}, \[Lambda]][[1]];
(*寻找最优 a 值*)
optimalA =
NMinimize[{maxError[a], a > 0}, a,
Method -> {"SimulatedAnnealing", "PerturbationScale" -> 3},
PrecisionGoal -> 3];
(*输出最优 a 值*)
aOpt = a /. optimalA[[2]];
\[Lambda]Opt = \[Lambda] /.
Last[NMaximize[{error[\[Lambda], aOpt],
0 < \[Lambda] < 1}, \[Lambda]]];
Print["最优 a 值为: ", NumberForm[aOpt, 20]];
Print["最大误差为: ", NumberForm[optimalA[[1]], 20]];
Print["最优 \[Lambda] 值为: ", NumberForm[\[Lambda]Opt, 20]];
(*误差图像*)
Plot[error[\[Lambda], aOpt], {\[Lambda], 0, 1}, PlotRange -> All,
PlotLabel -> "最大误差 = " <> ToString[NumberForm[optimalA[[1]], 10]]]


  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可惜的是13楼的代码运行时有点卡,但能运行。


  • xzcyr
  • 吧主
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
还在这执迷不悟呢,我8楼已经说了,当a取46.4483…时,误差函数的最大值根本不在0.898…,而在0.987…,用于验算的代码就在8楼,不要视而不见。NMaximize/NMinimize虽然是全局极值求解器,当计算非线性问题时依旧可能找错位置,这在自带帮助的“更多信息和选项”部分是明确说了的。


  • xzcyr
  • 吧主
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
take = (Reverse[Cases[#, Line[lst_] :> lst, Infinity][[1]], 2] //
Sort) &;
help[a_?NumericQ] := ({max, lambdavalue} =
take@Plot[Abs[F[\[Lambda], a] - G[\[Lambda]]], {\[Lambda], 0, 1},
PlotRange -> All] // Last; max)
help[46.4483]
lambdavalue
(*
0.0000188764
0.986958
*)


2025-12-03 09:43:42
广告
不感兴趣
开通SVIP免广告
  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
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]


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 36回复贴,共1页
<<返回mathematica吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示