拟合吗,需要设定拟合的方法吧!
比如我用最小二乘法拟合你的部分数据,分别用E指数,级数来尝试了下
1:原来数据用ListLinePlot画出,
2:E指数拟合;FindFit[data,model1,{a,b,c},x];其中model=a Exp[b x]+c;
3:x级数拟合;Fit[data,{1,x,x^2,x^3,x^4,x^5,x^6,x^7},x];
之后要自己修正了
嗯……虽然距离你问出这个问题已经过了满久并且一个似乎并不完全符合你期待的答案也被推荐了但是,鉴于我看完你的追问后有了更好的答案那我还是冒着自降采纳率的风险来答一下题吧。
总之你主要是想算弧长是吧,那就好说了。利用参数方程。
先把你的数据导进来:
data = ImportString@"0 39.1266
2.0486 39.0904
4.0972 38.982
6.1456 38.802
8.194 38.5497
10.2415 38.2218
12.2856 37.8111
14.3252 37.3185
16.362 36.7497
18.3939 36.1
20.409 35.3495
22.4092 34.5071
24.3998 33.5835
26.3503 32.5399
28.2872 31.4161
30.17 30.17
32.0275 28.8377
33.8113 27.3799
35.5465 25.8261
37.2137 24.1669
38.7874 22.3939
40.2702 20.5187
41.6548 18.5459
42.9295 16.4791
44.0823 14.3232
45.1032 12.0854
45.9838 9.7742
46.7167 7.3992
47.2941 4.9708
47.7076 2.5002
47.9492 0
48.0177 -2.5165
47.9164 -5.0362
47.6397 -7.5454
47.1903 -10.0306
46.6107 -12.4893
45.9161 -14.919
45.1068 -17.3149
44.1822 -19.6712
43.1462 -21.9841
41.9993 -24.2483
40.7391 -26.4563
39.3711 -28.6048
37.897 -30.6884
36.3137 -32.697
34.6295 -34.6295
32.8447 -36.4777
30.9595 -38.2318
28.9838 -39.8928
26.9148 -41.4451
24.7637 -42.8919
22.5304 -44.2184
20.2252 -45.4266
17.8511 -46.5036
15.4179 -47.4514
12.9309 -48.2586
10.3999 -48.9276
7.832 -49.4492
5.2369 -49.8255
2.6231 -50.051
0 -50.1266
-2.6231 -50.051
-5.2369 -49.8254
-7.832 -49.4493
-10.3999 -48.9276
-12.9309 -48.2586
-15.4179 -47.4514
-17.8511 -46.5037
-20.2252 -45.4265
-22.5304 -44.2185
-24.7637 -42.8919
-26.9148 -41.4451
-28.9838 -39.8928
-30.9595 -38.2318
-32.8447 -36.4777
-34.6295 -34.6295
-36.3136 -32.697
-37.8971 -30.6884
-39.3711 -28.6048
-40.7391 -26.4563
-41.9993 -24.2483
-43.1462 -21.9841
-44.1822 -19.6712
-45.1069 -17.3149
-45.9161 -14.919
-46.6107 -12.4893
-47.1903 -10.0306
-47.6396 -7.5454
-47.9164 -5.0362
-48.0179 -2.5165
-47.9491 0
-47.7074 2.5002
-47.2941 4.9708
-46.7168 7.3992
-45.984 9.7742
-45.1034 12.0854
-44.0825 14.3233
-42.9262 16.4791
-41.6549 18.546
-40.2703 20.5187
-38.7874 22.3939
-37.2136 24.1668
-35.5466 25.8261
-33.8114 27.3799
-32.0275 28.8376
-30.1701 30.1701
-28.2872 31.4161
-26.3603 32.5399
-24.3998 33.5835
-22.4091 34.5071
-20.409 35.3495
-18.3939 36.1001
-16.362 36.7496
-14.3251 37.3183
-12.2856 37.8112
-10.2416 38.2221
-8.194 38.5499
-6.1456 38.8018
-4.0971 38.9817
-2.0486 39.0901
0 39.1266";
p = ListPlot@data
……你确定这货是桃心?
不管,总之我们现在的思路是寻找参数方程。我们姑且来看一下x和y的情况:
ListPlot@Transpose@data
似乎相当规律嘛,应该可以FindFit,不过,为了通用性,这里我们还是插值好了(FindFit的思路留给你自己探索了):
{x, y} = Interpolation /@ Transpose@data;
Show[p, ParametricPlot[{x[t], y[t]}, {t, 1, Length@data + 1}]]
然后要算长度的话就积分:
NIntegrate[Sqrt[x'[t]^2 + y'[t]^2], {t, 1, 30}]
当然你可能觉得用点的次序做参数不够方便,那你可以考虑用角度,在获取一开始的data的时候做点手脚:
argdata =
Most@Transpose@{Arg@Total[{1, I} Transpose@data], #} & /@ Transpose@data;
{argx, argy} = Interpolation /@ argdata;
Show[p, ParametricPlot[{argx[a], argy[a]}, {a, -Pi, Pi}]]
有几条警告,这不成问题。总之,现在自变量变成角度了,应该要直观很多了:
NIntegrate[Sqrt[argx'[a]^2 + argy'[a]^2], {a, 0, Pi/2}] (* 第一象限部分的长度 *)