[ LONSG 计划散分200分,程序完整的话,再送100 ] 我来出题,你来做,关于曲线拟合 ( 积分: 200 )

  • 主题发起人 主题发起人 gxc418gxc
  • 开始时间 开始时间
G

gxc418gxc

Unregistered / Unconfirmed
GUEST, unregistred user!
[ 计划散分300分 ] 如果给定180个离散的点,比如用数组给出的是(设为Y从标) A[0]:= ,A[1]:= , ....A[179]:= [已经在下文中将其数据给出]; 其对应的X坐标为 2,4,6,...,360.如何用 曲线拟合[可暂先用 最小二乘法] 的方式将其图形画出啊?

所读180个数据如下:
95.425
95.9
96.575
97.175
97.725
98.25
98.725
99.175
99.525
99.85
100.125
100.375
100.55
100.675
100.75
100.775
100.775
100.775
100.75
100.5
100.2
99.8
99.35
98.8
98.25
97.6
96.85
96
95.1
94.1
93.025
91.875
90.625
89.3
87.9
86.425
84.825
83.175
81.425
79.55
77.625
75.625
73.475
71.375
69.225
66.975
64.9
62.65
60.225
57.6
55.15
52.7
50.225
47.775
45.325
42.875
40.45
38
35.65
33.35
31.05
28.825
26.65
24.575
22.475
20.625
18.775
17.025
15.35
13.725
12.3
10.925
9.55
8.3
7.25
6.225
5.25
4.4
3.6
2.875
2.25
1.725
1.275
0.9
0.55
0.325
0.15
0.05
0.025
0
0.025
0.125
0.325
0.575
0.925
1.325
1.775
2.2
2.725
3.325
3.925
4.625
5.375
6.075
6.85
7.625
8.5
9.375
10.25
11.2
12.15
13.15
14.2
15.25
16.35
17.45
18.55
19.75
20.9
22.125
23.35
24.525
25.75
27.05
28.35
29.7
30.95
32.325
33.625
34.975
36.275
37.65
39
40.325
41.7
43.05
44.425
45.8
47.225
48.55
49.95
51.35
52.75
54.125
55.5
56.825
58.175
59.525
60.85
62.175
63.5
64.775
66.1
67.35
68.6
69.875
71.125
72.35
73.525
74.75
75.975
77.05
78.225
79.35
80.475
81.575
82.625
83.725
84.75
85.725
86.725
87.725
88.675
89.6
90.475
91.35
92.2
93
93.8
94.525
 
对DELPHI基础类稍懂一点的都能画出来吧!
 
把楼主的数据放在Excel中用折线图进行展示——是一条蛇形曲线——简单的用最小二乘
法来拟合似乎不现实啊。我估计要用到三角函数了。
 
zhlu: 话虽如此,做起来,并用用平滑曲线拟合好 似乎还有些难度吧。
creation-zy: 怎么就用到三角函数了呢,请明示,谢谢!
谢谢两位的回复
 
大家要是有对我的题目感兴趣,可以粘贴到memo1.lines.items中去,然后进行数据处理也可以,这样子快,并且也可以利用ole导入到Excel中去,进行数据处理,OK ?
等待达人 回复中......
 
看起来方程应该是这个样子(变了形的正弦曲线):
y = a * ( sin( ( x * b ) + c + sin( ( x * d ) + e ) ) + 1 )
从数据看来,由于最小值是0,最大值是100.775,所以,a的值应该是 100.775/2 。而要
求出b、c、d、e的值,就只能通过随机试探的方法了。

另外考虑到图像接近三角函数,楼主可以考虑使用傅立叶变换,用多个不同周期的三角函
数来逼近它(形如: y=a1*sin(x+b1)+a2*(2*x+b2)+a3*sin(4*x+b3)+a4*sin(8*x+b4))。
 
请教高手啊,怎么没人回答了啊,建议给我一个用Delphi写的最小二乘法的详细代码,谢谢大家
 
请教高手啊,怎么没人回答了啊,建议给我一个用Delphi写的最小二乘法的详细代码,谢谢大家
 
请教高手啊,怎么没人回答了啊,建议给我一个用Delphi写的最小二乘法的详细代码,谢谢大家
 
up ,up ,upup ,up ,up
 
大富翁上的人都沒這種水平
 
看来楼上的水平是论坛上最高的了,否则不会知道“大富翁上的人都沒這種水平”[:)]


找了半天,发现了一个页面:
http://www.jdzzz.com/article/40/75/6772.htm?jHna51=p52FWtrMQQ
看起来它可以实现最高 M-1 次方的曲线拟合(变量系数在数组A中),很厉害了。
 
我用点子之间的连线,构成的曲线还算不错,就是没有把 二次拟合 搞进去,希望高手再指点一二
 
我已经自已辛辛苦苦解决了二次曲线的拟合问题了。哪位高手可以告诉我如何获得此条曲线的拐点,求出拐点区间,直接用最小二乘法大区间拟合,这个问题就会得以彻底解决了。[如果暂时还先不考虑其中的拐点处的两个导数值的差异所带来的对曲线圆滑过渡的影响的话]
 
在进行5点,或10点曲线拟合出方程后,在把区间扩充大到整个整数区间,发现导数值会有波动,也就是说实验测定的数据里面有不对的数据,这是最大的问题了。如何用一种算法可以将其忽略掉,这也是一个问题啊
 
老大,最小二乘法本来就是处理带误差的数据的,根本不用管什么导数、拐点。

下面是我用上面给出的C语言帖子的算法计算出来的曲线方程(只有到9次方后,理论曲线
和实际值的偏差才足够小):

最高9次方:
y = 95.25 + 2.7191401E-001 * x^1 + -5.1579196E-003 * x^2 + 2.2377774E-004 * x^3
+ -7.0928327E-006 * x^4 + 8.0123540E-008 * x^5 + -4.4086605E-010 * x^6
+ 1.3002982E-012 * x^7 + -1.9856663E-015 * x^8 + 1.2373601E-018 * x^9

最高11次方:
y = 93.69 + 6.5938589E-001 * x^1 + -3.0306406E-002 * x^2 + 9.1336398E-004 * x^3
+ -1.6564313E-005 * x^4 + 1.4659959E-007 * x^5 + -6.1584398E-010 * x^6
+ 6.4253138E-013 * x^7 + 4.6931934E-015 * x^8 + -2.0750866E-017 * x^9
+ 3.4259254E-020 * x^10 + -2.1213135E-023 * x^11


翻译成Delphi之后的最小二乘法曲线拟合算法代码如下:
type
TFloatAy=array of Double;
{
//X,Y -- X,Y两轴的坐标
//M -- 结果变量组数
//N -- 采样数目
//A -- 结果参数
}
function CalculateCurveParameter(X, Y: TFloatAy; M, N: Integer; A: TFloatAy):Boolean;
var
i,j,k:Integer;
Z,D1,D2,C,P,G,Q: Double;
B,T,S:TFloatAy;
begin
Result:=false;
if N<1 then exit;
SetLength(B,N);
SetLength(T,N);
SetLength(S,N);
if M>N then
M:=N;
for i:=0 to Pred(M) do
A:=0;
Z:=0;
B[0]:=1;
D1:=N;
P:=0;
C:=0;
for i:=0 to Pred(N) do
begin
P:=P+X-Z;
C:=C+Y;
end;
C:=C/D1;
P:=P/D1;
A[0]:=C*B[0];
if M>1 then
begin
T[1]:=1;
T[0]:=-P;
D2:=0;
C:=0;
G:=0;
for i:=0 to Pred(N) do
begin
Q:=X-Z-P;
D2:=D2+Q*Q;
C:=Y*Q+C;
G:=(X-Z)*Q*Q+G;
end;
C:=C/D2;
P:=G/D2;
Q:=D2/D1;
D1:=D2;
A[1]:=C*T[1];
A[0]:=C*T[0]+A[0];
for j:=2 to Pred(M) do
begin
S[j]:=T[j-1];
S[j-1]:=-P*T[j-1]+T[j-2];
if j>=3 then
begin
for k:=j-2 downto 1 do
S[k]:=-P*T[k]+T[k-1]-Q*B[k];
end;
S[0]:=-P*T[0]-Q*B[0];
D2:=0;
C:=0;
G:=0;
for i:=0 to Pred(N) do
begin
Q:=S[j];
for k:=j-1 downto 0 do
Q:=Q*(X-Z)+S[k];
D2:=D2+Q*Q;
C:=Y*Q+C;
G:=(X-Z)*Q*Q+G;
end;
C:=C/D2;
P:=G/D2;
Q:=D2/D1;
D1:=D2;
A[j]:=C*S[j];
T[j]:=S[j];
for k:=j-1 downto 0 do
begin
A[k]:=C*S[k]+A[k];
B[k]:=T[k];
T[k]:=S[k];
end;
end;
end;
Result:=true;
end;
 
记得好像老师说过:四阶龙格库塔是不错的.地球人都用它.
 
正在看 Creation_zy 的例子,希望能对我有用,先行谢过。 过后送分

还有人再回答一下吗?
 
又见creation-zy版主,谢谢
 
后退
顶部