- 注册时间
- 2015-8-20
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 1403
- 在线时间
- 小时
|
发表于 2024-4-11 14:48:42
|
显示全部楼层
本帖最后由 Jack315 于 2024-4-11 15:13 编辑
任取一个周期(25 个点)的数据,取模型中常数项初值为 \(c=1.0\),初始步长 \(h=0.1\),进行下列迭代:
- 在 \([c-h,c+h]\) 范围内均匀取 11 个点 \(c_i\)。
- 在每个点 \(c_i\) 上用 DFT 计算 \(y-c_i\) 的常数项。
- 以误差绝对值最小的 \(c_i\) 作为新的迭代参数 \(c\),同时步长 \(h\) 缩小到原来的 1/10 。
重复上述迭代过程,直到误差绝对值最小的 \(c_i\) 满足指定的数度要求。
【Mathematica 代码】
加载数据
- ClearAll["Global`*"]
- SetDirectory["C:\"];
- tbl = Import["Data.txt", "Table"];
- n = Table[tbl[[i]][[1]], {i, Length[tbl]}];
- y = SetPrecision[Table[tbl[[i]][[2]], {i, Length[tbl]}], 100];
复制代码
常数分量计算函数
- calConstant[y_] :=
- (*=======================================================*)
- (*计算 y 中的常数分量。*)
- (*=======================================================*)
- (*【输入参数】*)
- (*y: {Subscript[y, 1],Subscript[y, 2],...,Subscript[y, 25]} 原始数据。*)
- (*【输出数据】*)
- (*常数分量。*)
- Module[{ferr, optimal, step, offset, err},
- (*-------------------------------------------------------*)
- (*初始化。*)
- (*-------------------------------------------------------*)
- ferr[data_, bias_] := 1/5 Fourier[data - bias][[1]];
- optimal = SetPrecision[1, 100];
- step = SetPrecision[0.1, 100];
- (*-------------------------------------------------------*)
- (*迭代。*)
- (*-------------------------------------------------------*)
- While[step > 10^-48,
- offset = Subdivide[optimal - step, optimal + step, 10];
- err = Abs[Table[ferr[y, offset[[i]]], {i, Length[offset]}]];
- optimal = Part[offset, Position[err, Min[err]][[1]][[1]]];
- step /= 10;
- ]; (*end while*)
- (*-------------------------------------------------------*)
- (*返回结果。*)
- (*-------------------------------------------------------*)
- optimal
- ] (*end Module *)
复制代码
计算并保存结果:
- result = Table[{n[[i]], calConstant[y[[i - 24 ;; i]]]}, {i, 25, Length[y], 25}];
- Export["Constant.txt", result, "TSV"]
复制代码
【结果】
小数点后稳定的数字比原数据多了 1~2 位。
这是小数点后稳定的 33 位数字:0.998953960449742112505647176797204
如果数据中的常数项信息都已基本被提取了出来,
则意味着这个数据并没有提供预测未来某个时间步常数项小数点后 40 位数字所需的信息。
如果假设前提不成立,还有什么方法来提取更多的信息? |
|