2024年4月15日发(作者:)
Software Technique
基于Delphi平台平滑曲线的算法实现
唐清培,程汉湘,黄树毅,荆怀成
(广东工业大学自动化学院,广东广州510006)
摘要:为了便于观测与分析电力系统的运行情况,配电测控中心需要将采集的电能数据通过软
件输出显示为平滑曲线图。在Delphi软件开发环境下,采用三次样条插值算法程序在原数据点之间插
入适当节点,通过其自带图表控件DBChart输出理想的平滑曲线图。结果表明,直接应用算法程序比
另行安装第三方图表控件更为简便。
关键词:平滑曲线;三次样条;插值算法;图表控件
中图分类号:TP31 文献标识码:A
Realization of smooth curve algorithm based on Delphi
TANG Qing Pei,CHENG Han Xiang,HUANG Shu Yi,JING Huai Cheng
(Faculty of Automation,Guangdong University of Technology,Guangzhou 510006,China)
Abstract:To facilitate the observation and analysis of the operation of power system,the power distirbution measurement and control
center need to output and show smooth curves through software according to energy data collected.In Delphi,using cubic spline interpolation
algorithm to insert appropriate nodes between the original data points,and output ideal smooth curve through its own chart control of DBChart.
The results indicate that the direct application of algorithm pmgram is simpler than installment of third party contro1.
Key words:smooth curve;cubic spline;interpolation algorithm;chart contro1
近年来.国内外学者对应用最为普遍的样条插值法
高于三次的多项式
进行了深入的研究.并提出了一些新的保形插值算法.
(3)s( 。)=y (i=0,1,…,rt,)
例如圆弧样条插值算法…、非均匀有理B样条插值算法
则称s )为三次样条插值函数。
【2J等。这些算法能精确地描述曲线,平滑性、保形性好,
为了求解s( ),通常在区间[a,b】的2个端点处给
适合于机械的精细加工.因此被广泛应用于计算机辅助
出所必需的2个边界条件.常用的边界条件有以下两
设计和计算机辅助制造软件中。本文针对Delphi中无规
种【 ]: ‘
律离散点的平滑连接问题.提出采用计算最为简单的分
f11给定端点处的一阶导数,即:
段三次样条插值算法来解决。无需使用其他控件。与前
5 ( o)=y ,s ( )=,,
述算法相比,该算法不仅简单方便,而且在光滑性、保形
(2)给定端点处的二阶导数,即:
性等方面都有较好的效果。本文给出了分段三次样条插
值的构造过程、统一算法,然后利用Delphi 7软件编写
s”( 。):), , ”( )=,,:
特别地,s” 。)=s” )=0称为自然边界条件,满足
三次样条插值函数的通用程序.并通过数值算例证明该
程序的正确性
此条件的样条函数叫做自然样条函数。
1三次样条插值函数的定义
2三次样条插值函数的构造
设【。,b】上有插值节点a=x < ,<…< =b,对应函数
在实际计算中,通常用节点处的二阶导数来表示三
值为Y。,Y 一,Y 。若函数s( )满足以下3个条件:
次样条插值函数s( ),这样计算工作量小很多。
设s”( )= H,s x )= ,i=1,2,…,n。由前述条
(1)s( ), ( ),,5tt )在[a,b】上连续
件可以推导出用 来表达s( )的公式 :
(2)s )在每个子区间【 , 】( 1,2,…,n)上是不
《微型机与应用》2010年第2期
欢迎网上投稿WWW.pcachina.corn 7
童
一
州
!
对第一种边界条件,取:
..一.
如。一争 2)
+Yi
c={l,1,鲁( 一yo), 6(y
对第二种边界条件,取:c={0,0,2y 2y:}
现,可将式(5)与式(6)统一为下式:
(1)
2
1
))
Mi 2)丁X-Xi_1
设A0= 1), =C(2),go=C(3), :G(4)。为便于计算机实
∈【 1, 】,h = 一 —l, =1,2,…,n
A 0
2
●
●
M0
I
●
下面介绍s( )在各子区间上插值函数的构造方法。
首先利用s ( )在 ( 1,2,…,n一1)上的连续性,
go
gi
:
●
:
(8)
可得线性方程组:
M
l+2M +A M +l=g ( =1,2,…,n一1) (2)
=
1-#i =
/Yi十i—Yi Yl— 1 1
\h…h /。
然后由第一种边界条件s ( 。)= 与s x )=y ,可
以导出以下2个方程:
2M。 = ( t) (3)
一 =
6 )
将式(2)、式(3)与式(4)合在一起,即可得线性方程组
2 1
肘
go
tx 2
●
●
l
gl
●
:
:
●
I
2
M
n—
一
1 2
M
g
其 鲁( = 6 )1c
或由第二种边界条件M。=), 与M :y:,可得线性方
程组:
2 A.
l
gl-Ixl,,,0
2
2
●
:
2
2 A
2
~
2
一
1 2
。
(6)
式(5)、式(6)的系数矩阵均为三对角阵且是对角占优阵,
故存在唯一解,可用追赶法求解。将求得的解代人式
(1),就可以构造出【a,b1上的插值函数。
3算法分析
假定给定样本节点( ,Y ),i=0,l,2,…,n用一维数组
C(1,4)把这两类边界条件的样条作统一处理『4_:
C(2)
0+c(1)
M .+
Ml=c(
=c(
3)
4)j
1
L J
8
1
一
l 2
g 一
g
显然,式(8)中的系数矩阵也为三对角矩阵,经LU分解
后,原式等价于:
r上0
Zo
go
1 al
Zl
● ●
g1
●●
●
●
:
:
●
~
l n一1
Z
a
Z
g
1 /30
0
Zo
1
l
Zl
● ●
: :
1 /3
n
Z
n
1
Z
由此可得计算公式:
对 1,2,…,n一1,有:
/30=A 0/2,Z0=go/2,/3 =A /a =A /(2_ 卢 一1),
Z =(g 一 Z卜1)/a :(g -/z…Z 1)/(2_ JB 一1),
M =Z 一』B M…;
对i=n,有: .
M = =( -/z 一。)/(2 )。
4 Delphi程序设计
在Delphi环境下根据上述算法求解式(8),该子过程
定义为SPLINE,其程序代码如下:
procedure SPLINE(X:array of real;var Y:array of
real;N:integer;YPI.YPN:real;var Y2:array of rea1);
Var
C:array【1..4]of real;
BET.Z:array of real:
AAA,MIU,BBB,CCC,D:real;
I.K:integer; .
begin
Setlength(BET,N);
Setlength(Z,N);
《微型机与应用》2010年第2期
If(YP1>9.9E+29)Or(YPN>9.9E+29)then begin
C[1】:=0;
C[2】:=0;
C【3】:=0;
C【4】:=0;
end
else
begin
AAA:=(Y【1卜Y【0】)/(X[1卜X【0】);
C【1】:=1;
C[2】:=l;
C【3]:=6/(X【1]一X[O1) (AAA—YP1); C[4】:=6/
(X[N一1]一X[N-2]) (YPN-(Y[N-1卜Y[N一2】)/(X[N一1卜X
【N一2】));
end;
Z[0】:=C【3】/2;
BET[0]:=C【1】/2;
For I:=1 ro N一2 do
begin
MIU:=(X【I]一X[I一1】),(x[i+1】一x[i一1】);
BET【I】:=(1一MIU)/(2一MIU BET[I一1】);
AAA:=(Y[I+1】一Y【I】)/(X[I+1】一X【I】);
BBB:=(Y[I】一Y[I一1】),(X[I】一X[I一11);
CCC:=X【I十l】一x[i—l】;
D::6 (AAA—BBB)/CCC;
Z【I]::(D—MIU Z[I-1】)/(2-MIU BET[I-1]);
end;
MIU:=C【2】;
D:=C[4】;
Z[N-l】:=(D-MIU Z[N-2])/(2一MIU BET[N-2]);
Y2[N一1】:=Z【N一1】;
For K:=N一2 DownTo 1 do Y2[K】:=Z[K]一BET[K】
Y2[K+1】;
end;
将子过程SPLINE输出的各节点的二阶导数代入式
(1),从而可求得各插值点的函数值。该子过程定义为
SPLINT,限于篇幅,其程序代码可直接参考文献【51。
5算例分析
设测量得到的日整点单相电压值为:
231.9,232.7,230.5,232.5,230.6,
231.2,230.4,216.3,201.7,206.3,
y=
211.2,218.9,214.3,219.7,197.7,
201,201.2,223.8,214.7,220,221.8,
224,234.1,232.6
为简单起见.可将这些数据点的下标值作为本节点
的横坐标值.即:
《微型机与应用》2010年第2期
/o,1,2,3,4,5,6,7,8,9,lO,11,12,13,\
\14,15,16,17,18,19,20,21,22,23 /
为了使折线图尽量平滑,可选择插入点:
o.33,0.66,1.33,1.66,2.33,2.66,
3.33,3.66,4.33,4.66,5.33,5.66,
6.33,6.66,7.33,7.66,8.33,8.66,
9.33,9.66,l0.33,l0.66,11.33
xl=
11.66,12.33,12.66,13.33,13.66,
14.33,14.66,15.33,15.66,16.33,
16.66,17.33,17.66,l8.33,18.66,
l9.33,19.66,20.33,20.66,21.33,
21.66,22.3,22.66
由此,利用前述插值算法计算出插入节点的y值,
并存入SQL Server 2000数据库中。在Delphi 7环境下新
建工程.利用图表控件DBChart即可将样本节点及插入
点平滑地连接成曲线[61并显示出来。主要源代码如下:
procedure TForm1.Button1Click rSender:TObject);
Var
I,j:Integer;
X:array[0..23】of real;
X1:array[0..23】of real;
Y2:array[0..23】of real;
F1:real;
const
N=24;
Y:array[0..23】of
real=(231.9,232.7,230.5,232.5,230.6,231.2,230.4,216.3,
201.7,206.3,2l1.2,218.9,214.3,219.7,197.7,201,201.2,22
3.8,214.7,220,221.8,224,234.1,232.6);
begin
For I:=0 To 23 do X【I】:=1.0 I;
SPLINE(X,Y,N,1E+30,1E+30,Y2);
ADOConnection1.Execute( create table#xy(x float,Y float),);
with ADOQueryl do
begin
Close;
For I:=0 To 23 do
begin
SQL.text:="insert into#xy values(:x,:y) ;
Parameters.ParamByName('x ).Value:=X[I];
Parameters.ParamByName('y,).Value:=Y[I];
execSQL;
end;
For I:=0 To 22 do
begin
X1【I】:=I;
for j:=1 to 2 do
begin
欢迎网上投稿Www.pcachina.com 9
Software Technique
X1ⅢI:=X1【I】+0.33;
SPLINT(X,Y,Y2,N,X1【I],F1);
SQL.text:="insert into#xy values(:x,:y) ;
Parameters.ParamByName("x,)_Value:=X1【I】;
Parameters.ParamByName('y,).Value:=F1;
execSQL;
end;
end;
end;
with ADOQueryl do
begin
e]ose;
SQL.Text:="select from#xy order by x :
Open;
end;
DBChart1.Series[O].DataSource:=ADOquery1;
DBChart1.BottomAxis.Increment:=1.0:
DBChart1.Series[0].XValues.ValueSource:='x ;
DBChart1.Series[O].YValues.ValueSource:=,y ;
end;
以上程序在Delhi7下测试通过,图l为插值前样本
节点的折线图,运行效果如图2所示。比较二图可知,三
次样条插值使原折线在样本节点上有了很好的光滑性.
曲线平滑效果明显。
\
、
\ ,:
‘
,
,
、 r ,
:
,
^ /
●
l } \ / … / \ f / /
l
/
、 l
} 。
/ I
/
——
,
:
/
图i插值前的曲线图
目前,在Delphi环境下绘制平滑曲线一般需利用第
三方控件。但由于第三方控件存在可移植性不好、升级
维护麻烦等不足.因此本文采用分段三次样条插值算法
对原数据点进行插值处理.无需安装其他图表控件便可
输出显示平滑曲线。该算法程序简单、具有通用性.大大
缩短了软件开发周期
10
\、 : \
一
,~、
,/、
! \ /:
、 \
厂
\ | k 』
,
7 7
…
、 ,
t J/l 1
f
1住13 14 15 16”15’9 2
图2插值后的曲线图
参考文献
【1】舒振宇,汪国昭.开圆弧样条的保形插值算法fJ】.计算
机辅助设计与图形学学报,2007,(111.
【2]王宁,禹仁贵.非均匀有理B样条曲线的快速实现【J】.
菏泽学院学报,2009.f02).
【3]李红.数值分析【M】.武汉:华中科技大学出版社,2003.
[4】冯天祥.两类三次样条插值函数的统一解法【J】.西南交
通大学学报,2o03,38(4):450—453.
【5】何光渝,雷群.Delphi常用数值算法集【M】.北京:科学出
版社.20o1.
[6】宋坤,邹天思.Delphi数据库系统开发完全手册【M】.北
京:人民邮电出版社,2006.
(收稿13期:2O09—09一l5)
作者简介:
唐清培,男,1982年生,在读硕士研究生,主要研究
方向:电力系统综合自动化:
程汉湘,男,1957年生,教授,硕导,主要研究方向:
电力系统综合自动化:
黄树毅,男,1983年生,在读硕士研究生,主要研究
方向:电力系统综合自动化
《微型机与应用》2010年第2期
发布评论