- 注册时间
 - 2015-8-20
 
- 最后登录
 - 1970-1-1
 
- 威望
 -  星
 
- 金币
 -  枚
 
- 贡献
 -  分
 
- 经验
 -  点
 
- 鲜花
 -  朵
 
- 魅力
 -  点
 
- 上传
 -  次
 
- 下载
 -  次
 
- 积分
 - 1569
 
- 在线时间
 -  小时
 
 
 
 
 
 
 | 
 
 
发表于 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 位数字所需的信息。 
 
如果假设前提不成立,还有什么方法来提取更多的信息? |   
 
 
 
 |