找回密码
 欢迎注册
楼主: 笨笨

[求助] 用Mathematica编程求出最大误差函数值时如:10⁻⁸下的(x,a,b,c,d)

  [复制链接]
发表于 2023-8-23 02:54:53 | 显示全部楼层
本帖最后由 elim 于 2023-8-23 02:56 编辑

相信这里的探讨的理论阐述会相当繁琐,或许可以从优化参数序列的(包络)极限来理解?总之很妙很有趣!

现在可设法用初等超越函数$\varphi_2$拟合楼上的 $Er$, 使 $\|E_r-\varphi_2\|_{\infty}\le 10^{-12}$
作为阶段性的有理论合实际意义的结果.  

补充内容 (2023-9-15 05:35):
应为非初等函数。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-8-23 07:05:30 | 显示全部楼层
本帖最后由 笨笨 于 2023-8-23 07:09 编辑
elim 发表于 2023-8-23 02:54
相信这里的探讨的理论阐述会相当繁琐,或许可以从优化参数序列的(包络)极限来理解?总之很妙很有趣!

现 ...


10^(-12)是楼主一直以来的目标,这样的初等函数族或初等超越函数族估计没人能找出来!

光搞个10^(-7)都这么费劲,10^(-12)想都别想!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-8-24 15:33:03 | 显示全部楼层
【被拟合函数】
有一个比较复杂的函数:
\[\begin{matrix} F(x)=\sum_{n=0}^ \infty \begin{pmatrix}1/2\\n\end{pmatrix}^2x^{2n},&x\in[0,1]\end{matrix}\]
设想找一个由初等函数构成的函数 \(G(x)\) 来拟合 \(F(x)\),
使得两者之间的误差函数 \(Er(x)=F(x)-G(x)\) 的绝对值在定义域范围内越小越好。
目前希望能做到  \(|Er(x)|_{MAX}<10^{-8}\) 的水平 。

在题目中给出了这样一个等式:
\[\begin{pmatrix}1/2\\k\end{pmatrix}=\frac{1}{k!}\prod_{j=0}^{k-1}\bigg(\frac{1}{2}-j\bigg)\]
这个等式只有在 k 取正整数时成立。

现在主要关注等式的左边,因为它就出现在 \(F(x)\) 的定义中。
在 Mathematica 中它对应 \(Binomial[\frac{1}{2},k]\) 函数。
用下列命令简化 \(F(x)\) 函数:
  1. FullSimplify[\!\(TraditionalForm\`
  2. \*UnderoverscriptBox[\(\[Sum]\), \(n = 0\), \(\[Infinity]\)]\((
  3. \*SuperscriptBox[\(Binomial[
  4. \*FractionBox[\(1\), \(2\)], n]\), \(2\)]
  5. \*SuperscriptBox[\(x\), \(2  n\)])\)\)]
复制代码

\[\text{FullSimplify}\left[\sum _{n=0}^{\infty } \binom{\frac{1}{2}}{n}^2 x^{2 n}\right]\]
结果得到 \(Hypergeometric2F1[-\frac{1}{2},-\frac{1}{2},1,x^2]\)。
所以定义的这个比较复杂的函数实际上是一个超几何函数:
\[F(x)=Hypergeometric2F1[-\frac{1}{2},-\frac{1}{2},1,x^2]\tag{EQ:1}\]

当然,如果用上述等式右边来定义 \(F(x)\)
可以得到另外一个等价的函数。这里不作进一步讨论。

在 Mathematica 中用下列命令定义 \(F(x)\) :
  1. f[x_] := Hypergeometric2F1[-(1/2), -(1/2), 1, x^2]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-8-24 16:16:48 | 显示全部楼层
本帖最后由 Jack315 于 2023-8-24 16:19 编辑

【拟合函数】
在题目中给出了这样一个拟合函数:
\[G(x)=1+\frac{3x^2}{10+\sqrt{4-3x^2}}\tag{EQ:2}\]
在 Mathematica 中用下列命令定义 \(G(x)\) 函数:
  1. g[x_] := 1 + (3 x^2)/(10 + Sqrt[4 - 3 x^2])
复制代码


接下来用下列命令画出图来看一下这两个函数之间的误差曲线:
  1. LogPlot[(f[x] - g[x]), {x, 0, 1},
  2. PlotRange -> All,
  3. GridLines -> Automatic,
  4. Frame -> True,
  5. PlotLabel -> "待拟合函数与拟合函数的误差"]
复制代码

说明:图能不上不上了,新人权限太低,一直被限制。
大家可以自己在软件里画出来看。

结果发现,随着 x 的增加,误差快速增大,使得拟合精度变差。
所以就需要再用一个修正函数 \(H(x)\) 来修正这个误差。

点评

主要是新人,级别低只有长期发贴回贴权限会好些。  发表于 2023-8-24 17:34
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-8-24 16:44:00 | 显示全部楼层
本帖最后由 Jack315 于 2023-8-24 16:48 编辑

【修正函数】
在题目中给出了一个含参数的修正函数:
\[\begin{matrix}H(x,a,b,c,d)=\frac{3x^{10}}{2^{17}}(1+\frac{[\frac{79}{48}+(\mu-1-\frac{79}{48})x]x^2}{[1+x^a(1-x^b)^c]^d}),&\mu=\frac{2^{17}}{3}(\frac{4}{\pi}-\frac{14}{11})\end{matrix}\tag{EQ:3}\]

用下列命令定义 \(H(x)\) 函数:
  1. h[x_, a_, b_, c_, d_] := ((3 x^10)/2^17 (1 + ((79/48 + (\[Mu] - 1 - 79/48) x) x^2)/(1 + x^a (1 - x^b)^c)^d)) /. \[Mu] -> 2^17/3 (4/\[Pi] - 14/11)
复制代码


题目要求能找出这样一组 \((a,b,c,d)\) 的值,
使得拟合的糖度能达到要求。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-8-24 17:02:38 | 显示全部楼层
本帖最后由 Jack315 于 2023-8-24 17:49 编辑

【误差函数】
定义下列拟合的误差函数:
\[Err(x,a,b,c,d)=F(x)-G(x)-H(x,a,b,c,d)\tag{EQ:4}\]

用下列命令定义误差函数:
  1. err[x_, a_, b_, c_, d_] := f[x] - g[x] - h[x, a, b, c, d]
复制代码


题目中给了个例子:
例:当 \((x,a,b,c,d)=(0.997,0.53,2.75,0.82,3.38)\) 时,\(Er\approx6\times10^{-6}\)。

可以使用下列命令来查看误差函数的情况:
  1. (*定义参数*)
  2. x0 = x -> 0.997;
  3. param = {a -> 0.53, b -> 2.75, c -> 0.82, d -> 3.38};
  4. (*查看误差函数值*)
  5. err[x, a, b, c, d] /. x0 /. param
  6. (*查看定义域内误差曲线*)
  7. Table[Plot[err[x, a, b, c, d] /. param, {x, (i - 1)/4, i/4},
  8.   PlotRange -> All,
  9.   GridLines -> Automatic,
  10.   PlotLegends -> "Expressions",
  11.   Frame -> True,
  12. {i, 4}]
复制代码

点评

狼版见识过,确实人很好,也很低调。  发表于 2023-8-24 18:14
还有狼版,低调的高人。  发表于 2023-8-24 18:07
楼上的那位Ickiverar网友感觉数学功底很厉害,elim网友都很厉害。感谢各位  发表于 2023-8-24 17:52
不客气的,能与各位高人一起玩玩是乐趣。  发表于 2023-8-24 17:46
非常感谢先生码了这么,很耗精力与时间。再次感谢  发表于 2023-8-24 17:40
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-8-24 17:21:28 | 显示全部楼层
本帖最后由 笨笨 于 2023-8-24 17:42 编辑
Jack315 发表于 2023-8-24 17:02
【误差函数】
定义下列拟合的误差函数:
\[Err(x,a,b,c,d)=F(x)-G(x)-H(x,a,b,c,d)\tag{EQ:4}\]


感谢先生闲暇时间回帖.有以下内容可供参考。
1.jpg
2.jpg

点评

认可!作为初学者,楼主要虔诚学习一下。  发表于 2023-8-24 18:12
Mathematica 是非常优秀的软件。出问题时,更多的时候是我们的代码不到位。  发表于 2023-8-24 18:05
感觉由软件漏洞导致,最近才发现这个问题,至于精度计算时都趋于无穷大了,还是有极小微差。为什么其它函数相减都没有极小微差呢。  发表于 2023-8-24 17:55
误差是因为软件计算方法可能有差异,由计算精度导致。  发表于 2023-8-24 17:42
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-8-24 17:37:42 | 显示全部楼层
【解题思路】
假设给一组 (a,b,c,d) 的值,利用 (EQ:4) 定义的
Err 函数就能求出 x 在其定义域 [0,1] 范围内的最大值。
将这个过程包装到一个新的函数中:
  1. maxErr[aVal_, bVal_, cVal_, dVal_] :=
  2. Module[{a = aVal, b = bVal, c = cVal, d = dVal},
  3.   MaxValue[{Abs[err[a, b, c, d, x]], 0 <= x <= 1}, x \[Element] Reals]
  4.   ]
复制代码

然后用下列命令进行求解:
  1. sol = NMinimize[{maxErr[a, b, c, d], {a, b, c, d} \[Element] Reals}, {a, b, c, d}]
复制代码

运行一段时间后,给出了结果……

结果不贴出来了,因为答案是错误的。
原因是 \(G(x)+H(x)\) 函数不是在整个参数空间都能计算出结果,
因而导致(自动的)优化过程步入了歧途。

解决的方法大致有两种:
1. 修改代码,使得代码能规避上述导致错误的原因……期待高人出手。
2. 利用相关的方法(如 DOE、RSM:即梯度优化),一步步的进行手工优化。
这个方法效率特别低,所以不建议,但最终应该能得到一个结果。
至少可以得到一个局部解。

点评

英雄所见略同。  发表于 2023-8-24 18:02
看来方法很重要,方法不对得出的结果也不对。  发表于 2023-8-24 17:57
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-8-24 18:05:27 | 显示全部楼层
Jack315 发表于 2023-8-24 17:02
【误差函数】
定义下列拟合的误差函数:
\[Err(x,a,b,c,d)=F(x)-G(x)-H(x,a,b,c,d)\tag{EQ:4}\]

先生你好,代码少一个中括号:

QQ截图20230824180435.jpg
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-8-24 18:14:39 | 显示全部楼层
本帖最后由 Jack315 于 2023-8-24 18:21 编辑
笨笨 发表于 2023-8-24 18:05
先生你好,代码少一个中括号:


复制的时候漏掉了。重新来过:
  1. (*定义参数*)
  2. x0 = x -> 0.997;
  3. param = {a -> 0.53, b -> 2.75, c -> 0.82, d -> 3.38};
  4. (*查看误差函数值*)
  5. err[x, a, b, c, d] /. x0 /. param
  6. (*查看定义域内误差曲线*)
  7. Table[Plot[err[x, a, b, c, d] /. param, {x, (i - 1)/4, i/4},
  8. PlotRange -> All,
  9. GridLines -> Automatic,
  10. PlotLegends -> "Expressions",
  11. Frame -> True,
  12. PlotLabel -> "超几何函数与(修正后)拟合函数的误差"],
  13. {i, 4}]
复制代码

点评

谢谢  发表于 2023-8-24 18:17
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-12-22 00:46 , Processed in 0.033751 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表