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

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

  [复制链接]
发表于 2023-9-7 08:32:46 | 显示全部楼层
本帖最后由 Jack315 于 2023-9-7 09:07 编辑


18#,20# 的误差曲线与这个函数的形状类似,
看看能不能在这个函数上下点功夫:
  1. Plot[0.000000182658599579 Sin[15.7 x^10], {x, 0, 1}, GridLines -> Automatic, Frame -> True]
复制代码


误差曲线上有 6 个零点,3 个极大值,2 个极小值。
用这 11 个点拟合 Sin 函数里的 10 次多项式(11 个参数),
不知道效果会如何。

点评

先把两端点固定好,然后就是曲线拟合的形状大致差不多就可以啦  发表于 2023-9-7 13:17
误差曲线是个振荡形态,基本初等函数里就是 Sin 函数哈。  发表于 2023-9-7 11:19
真没想到这么奇葩的误差函数也有相仿的简单拟合函数,漂亮!  发表于 2023-9-7 09:26
由于是技术突破向前一点点,加分!  发表于 2023-9-7 09:24
眼前一亮,像!太像了!感觉有希望了。继续加油,楼主再看看厉害  发表于 2023-9-7 09:23

评分

参与人数 1威望 +1 金币 +1 贡献 +1 经验 +1 鲜花 +1 收起 理由
笨笨 + 1 + 1 + 1 + 1 + 1 赞一个!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-7 17:22:50 | 显示全部楼层
本帖最后由 Jack315 于 2023-9-8 00:56 编辑
Jack315 发表于 2023-9-7 08:32
18#,20# 的误差曲线与这个函数的形状类似,
看看能不能在这个函数上下点功夫:


要把所有的峰都对齐,看样子又有点难度。
这里再给一个脱胎于 Weill 分布函数的一种函数形式:
\[c\bigg(\frac{1-bx}{a}\bigg)e^{-\big(\frac{1-bx}{a}\big)^2}\]

  1. weibull[x_, {a_, b_, c_}] := c ((1 - b x)/a) E^-((1 - b x)/a)^2

  2. Plot[{weibull[x, {0.2, 2, 1}], weibull[x, {0.2, 1, 1}]}, {x, 0, 1},
  3. PlotRange -> All,
  4. GridLines -> Automatic,
  5. Frame -> True]
复制代码


一个这样的函数对齐两个峰。也可以对齐最后一个峰。
这样或许可以将精度提高到 1e-8 以下。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-8 01:46:02 | 显示全部楼层
本帖最后由 Jack315 于 2023-9-8 01:47 编辑
Jack315 发表于 2023-9-7 17:22
要把所有的峰都对齐,看样子又有点难度。
这里再给一个脱胎于 Weill 分布函数的一种函数形式:
\[c\bigg( ...


这个函数形式能行,这是对前两个峰补偿的效果:
效果_01.png
一轮降峰应该能到 1e-8 以下。
多轮降峰最后会不会也有“天花板”还要试了才知道。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-8 14:53:45 | 显示全部楼层
本帖最后由 Jack315 于 2023-9-8 15:09 编辑

对于剩余误差 \(F(x)-G(x)-H(x)\) 再进行补偿的设想。

剩余误差有五个极值点,六个零点。
补偿的关键在于五个极值点的位置 (x) 必须精确对准。
通常的基本初等函数组合,如幂函数的和,很难做到这一点。
为避免使用分段函数,使用由正态分布函数导出的一个补偿函数:
\[\frac{a}{s}e^{-b(\frac{x-m}{s})^2}\]
让五个这样的补偿函数分别对准五个极值点。

补偿的方法由两种:
1. 由五个补偿函数的和拟合剩余误差,即最小化下列积分:
\[\int_0^1\bigg[err(x)-\sum_{i=1}^5\frac{a_i}{s_i}e^{-b_i(\frac{x-m_i}{s_i})^2}\bigg]^2dx\]
2. 由五个补偿函数的和在极值点精确拟合角度,而在即它点上曲线尽量保持顺滑。
即最小化下列和式(应该为零,可能还需要其它优化约束条件):
\[\sum_{i=1}^5\bigg[\theta_i-\frac{a_i}{s_i}e^{-b_i(\frac{x_i-m_i}{s_i})^2}\bigg]^2\]
其中:\(x_i\) 为五个极值点位置,\(\theta_i=n\frac{\pi}{2}\),为极值对应的角度。
然后用 \(k\sin[\sum_{i=1}^5\frac{a_i}{s_i}e^{-b_i(\frac{x_i-m_i}{s_i})^2}]\) 函数来拟合误差函数 \(err(x)\) 。

第一种方法比较有望能实现,精度应该也能到 1e-8 以下;
第二种方法若能实现,精度有望达到更高的水平。

点评

\(\Large\frac{a}{s}e^{-b(\frac{x-m}{s})^2}\)该函数族差劲的很!  发表于 2023-9-8 22:51
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-9-8 20:58:20 | 显示全部楼层
本帖最后由 笨笨 于 2023-9-8 21:02 编辑
这个函数形式能行,这是对前两个峰补偿的效果:
014206xbe2td2itfei2vht.png


请问这个函数形式是啥?

点评

使用 Sin 函数拟合的尝试不成功,因为无法用模型一次性全部对准各个峰的位置。开始找“窗函数”。去垃圾站找丢掉的代码……  发表于 2023-9-9 10:15
好的  发表于 2023-9-9 09:26
这是试验结果,只说明这种窗函数的方式基本可行。代码已到垃圾站了……。比较接近成功,有结果再分享。  发表于 2023-9-9 08:42
94楼的代码我拷贝进去得出的不是这个图像,请把得出这个图像的代码和生成的图一并截图看看?  发表于 2023-9-9 07:51
公式在 94#  发表于 2023-9-9 07:34
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-9-9 21:37:23 | 显示全部楼层
Mathematica具有“滑动条”功能

  1. Manipulate[
  2. Plot[{(Hypergeometric2F1[-(1/2), -(1/2), 1, x^2] - 1 - (3 x^2)/(
  3.      10 + Sqrt[4 - 3 x^2]) -
  4.      3/2^17 x^10 ((4/\[Pi] - 14/11) 2^17/3)^(
  5.       x^2/(1 +
  6.         425.524154 x^-2.4565895 (1 -
  7.            x^0.04701004)^0.94801807)^0.1537177)),
  8.    a Sin[b x^c + d x + e], -1.3830579792539766`*^-7,
  9.    1.3830579792539766`*^-7}, {x, 0, 1}], {a, -20, 20}, {b, -20,
  10.   20}, {c, -20, 20}, {d, -20, 20}, {e, -20, 20}]
复制代码

QQ截图20230909211905.jpg
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-9 23:28:25 | 显示全部楼层
还没适应本论坛的 MathJax 设置。所以贴个图:
Image7.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-10 02:55:26 | 显示全部楼层
elim 发表于 2023-9-9 23:28
还没适应本论坛的 MathJax 设置。所以贴个图:

差不多想到一个方向上了……

设拟合函数为:\(f_{Fit}(x;a,b,c)=a+bx+cx^2\);
窗函数为:\(f_{Win}(x)=e^{-(\frac{x-\mu}{\sigma})^2}\)
则两函数的积 \(f(x;a,b,c)=f_{Fit}(x;a,b,c) \times f_{Win}(x)\)
就可以得到某个区间内的拟合函数。而区间外接近为零。
函数集:\(\sum_{i=1}^nf(x;a_i,b_i,c_i)\) 即可将任意函数拟合到任意想要的精度。
其实这个就是分段拟合的思路,则是不出现 \(Picewise(x;a,b)\) 函数而已。

如果拟合函数使用更多项:\(f_{Fit}(x;\lambda_0,\lambda_1,...\lambda_k)=\sum_{i=0}^k\lambda_ix^i\);
而窗函数使用:\(f_{Win}(x)=\bigg\lfloor\frac{|1+x|}{1+|x|}\bigg\rfloor=\begin{cases}1&\text{if }x\ge0\\0&\text{if }x<0\end{cases}\)
则拟合效果更好,逼近速度也更快。

点评

好像也没下文了  发表于 2023-9-11 20:45
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-9-11 05:55:09 | 显示全部楼层
本帖最后由 笨笨 于 2023-9-11 05:58 编辑
Jack315 发表于 2023-9-10 02:55
差不多想到一个方向上了……

设拟合函数为:\(f_{Fit}(x;a,b,c)=a+bx+cx^2\);


要考虑到定义域:0≤x≤1
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-9-11 06:04:30 | 显示全部楼层
本帖最后由 Jack315 于 2023-9-11 06:26 编辑

几种窗函数:
\[\begin{align*}&e^{-(\frac{x-m}{s})^2}\tag{1}\\&\frac{e^{2kx}(e^{2ak}+e^{2bk})}{(e^{2ak}+e^{2kx})(e^{2bk}+e^{2kx})}\tag{2}\\&\frac{e^{2kx}(-e^{2ak}+e^{2bk})}{(e^{2ak}+e^{2kx})(e^{2bk}+e^{2kx})}\tag{3}\\&\frac{1}{2tan^{-1}(\frac{b-a}{2}k)}\big(tan^{-1}[k(x-a)]-tan^{-1}[k(x-b)]\big)\tag{4}\end{align*}\]

(1) 式由正态分布概率密度函数导出;
(2)、(3) 式由双曲正切函数导出,
前者是两个双曲正切函数的乘积,
后者是两个双曲正切函数的差,
(4) 式是两个反正切函数的差。
顺便说一下:
1. 由 Weibull 分布概率密度函数导出的形式,感觉不太合适,暂时不考虑。
2. 两个双曲正切还可以构造出倾斜峰的形状,或可直接用于进行拟合。
3. 两个反正切函数的乘积的曲线形状与误差函数 \(2F1(x)-(1+\frac{3x^2}{10+\sqrt{4-3x^2}})\) 相似。

下列代码显示倾斜峰的曲线:
  1. Plot[(Tanh[10 x - 5] Tanh[-20 x + 6] + 1), {x, 0, 1},
  2. PlotRange -> All,
  3. Filling -> Axis,
  4. GridLines -> Automatic,
  5. Frame -> True,
  6. PlotLabel -> "倾斜峰函数"]
复制代码

下列代码定义这四个窗函数:
  1. fwin0[x_, {m_, s_}] := E^-((x - m)/s)^2
  2. fwin1[x_, {k_, a_, b_}] := (E^(2 k x) (E^(2 a k) + E^(2 b k)))/((E^(2 a k) + E^(2 k x)) (E^(2 b k) + E^(2 k x)))
  3. fwin2[x_, {k_, a_, b_}] := (E^(2 k x) (-E^(2 a k) + E^(2 b k)))/((E^(2 a k) + E^(2 k x)) (E^(2 b k) + E^(2 k x)))
  4. fwin3[x_, {k_, a_, b_}] := 1/(2 ArcTan[(b - a)/2 k]) (ArcTan[k (x - a)] - ArcTan[k (x - b)])
复制代码

下列代码显示窗函数曲线:
  1. Plot[{fwin0[x, {0.5, 0.05}], fwin1[x, {50, 0.1, 0.3}],
  2.   fwin2[x, {100, 0.4, 0.6}], fwin3[x, {1000, 0.7, 0.9}]}, {x, 0, 1},
  3. PlotRange -> All,
  4. Filling -> Axis,
  5. GridLines -> Automatic,
  6. Frame -> True,
  7. PlotLabel -> "几种窗函数",
  8. PlotLegends -> "Expressions"]
复制代码

有点奇怪的是 fwin3 的曲线在窗边缘似乎有点什么问题。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-5-10 11:14 , Processed in 0.179448 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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