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

 
 
 
日一二三四五六
       
       
       
       
       
       

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

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

本吧签到人数:0

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

  • 图片

  • 吧主推荐

  • 游戏

  • 9回复贴,共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 10:33:53
广告
不感兴趣
开通SVIP免广告
  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
主贴问题已解决:
苦战了几个夜晚,终于锁定最佳 a 值,用Mathematica 编程得到的值与自己先前预测值完美一致!!!
最佳 a=46.4483021270782……
最小化最大误差值为: 0.00001872118423551505……
最优 λ 值为: 0.898055159455627……


  • 晓笨笨
  • 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]


  • 晓笨笨
  • 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]]]


2025-12-03 10:27:53
广告
不感兴趣
开通SVIP免广告
  • 晓笨笨
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可惜的是13楼的代码运行时有点卡,但能运行。


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