二维插值算法与实现.ppt
1,几个算例,华东交通大学,教师:赵秀绍,2,第一个例题三角形的面积求解,3,三角形面积求解,可以采用一个界面的输入方式,也可采用inputbox的输入方式,但要注意,因为输入的次数为三次,要用定数循环,不能没有条件的循环。,4,三角形面积求解,Private Sub Form_Load()Text2=End SubPrivate Sub Text1_Change(Index As Integer)If Not IsNumeric(Text1(Index).Text)Then Text2.Text=输入的不是数字,请重新输入 Text1(Index).SetFocus Text1(Index).Text=Else Text2=输入的数字是正确的End IfEnd Sub,初始化,判断输入的数据,5,三角形面积求解,Private Sub Command1_Click()计算Dim A#,B#,C#,S#,Mianji#A=Val(Text1(0).Text)B=Val(Text1(1).Text)C=Val(Text1(2).Text)If A+B C And B+C A And A+C B Then S=(A+B+C)/2 Mianji=Sqr(S*(S-A)*(S-B)*(S-C)Text2.Text=Format(Mianji,三角形的面积为0.#)Else Text2.Text=输入的三条边不能构成三角形End IfEnd Sub,6,三角形面积求解方法2,7,三角形面积求解,Private Sub Command4_Click()On Error Resume NextDim AA()As StringIf Text3(0).Text Or Text3(1).Text Then If Option1(0).Value=True Then AA=Split(Text3(0).Text,)If Option1(1).Value=True Then AA=Split(Text3(1).Text,)Else Text4=没有数据输入End If下续,8,三角形面积求解,Function Split(Expression As String,Delimiter,Limit As Long=-1,Compare As VbCompareMethod=vbBinaryCompare)VBA.Strings 的成员 Split a string into an array解释:split把一个字符串按分隔符分成一个数组,这个数组须是动态数组。空格分隔容易出现问题,但逗号分隔不会出现问题。例如:,9,三角形面积求解,多加几个空格没有问题,但不能有两个逗号连着,多加几个空格出现问题,分解的值有问题,10,代码续,Dim A#,B#,C#,S#,Mianji#A=Val(AA(0)B=Val(AA(1)C=Val(AA(2)If A+B C And B+C A And A+C B Then S=(A+B+C)/2 Mianji=Sqr(S*(S-A)*(S-B)*(S-C)Text4.Text=三角形的三边分别为a=&A&,b=&B&,c=&C&vbCrLf&Format(Mianji,三角形的面积为0.#)Else Text4.Text=三角形的三边分别为a=&A&,b=&B&,c=&C&vbCrLf&输入的三条边不能构成三角形End IfEnd Sub,11,103.75,-1,38,7,15,1;96.75,1,86,52,30,1;420.77,-1,39,18,30,1;208.64,1,62,31,30,1;436.79,1,25,56,30,-1;56.48,-1,87,1,15,-1;98.8,-1,53,22,0,-1;68.62,1,36,38,0,-1;95.1,1,59,29,0,-1;207.41,-1,51,40,45,-1,12,Public Sub StrtoShuzhu(ByVal Str1 As String,A()As Double)Dim RowData As VariantDim ColData As VariantDim RowtmpDat As VariantDim ColTmpDat As VariantDim r As Integer,C As IntegerRowData=Split(Str1,;)ReDim A(UBound(RowData),1)r=-1,13,For Each RowtmpDat In RowDataColData=Split(RowtmpDat,)ReDim Preserve A(UBound(RowData),UBound(ColData)r=r+1C=-1For Each ColTmpDat In ColDataC=C+1A(r,C)=ColTmpDatNextNext,14,第二个例题含水率求解,15,含水率试验,要求两组计算一个平均值,当两个值求平均时,差值大于规范要求时,用红色背景显示该数据,16,含水率试验,Private Sub KJSZ(ByVal Shu As Integer)On Error Resume NextDim i As IntegerIf Shu=10 ThenText55.BackColor=vbRedText55=加载的试验组数过多,本程序暂时不能处理Exit SubEnd IfIf Shu 1 And Shu 10 Then For i=2 To Shu Load HSBH(i-1)HSBH(i-1).Visible=True HSBH(i-1).Top=HSBH(i-2).Top+350,加载控件数组,17,含水率试验,Load HShh(i-1)HShh(i-1).Visible=True HShh(i-1).Top=HShh(i-2).Top+350 Load HSmh(i-1)HSmh(i-1).Visible=True HSmh(i-1).Top=HSmh(i-2).Top+350 Load HSmhst(i-1)HSmhst(i-1).Visible=True HSmhst(i-1).Top=HSmhst(i-2).Top+350 Load HSmhgt(i-1)HSmhgt(i-1).Visible=True HSmhgt(i-1).Top=HSmhgt(i-2).Top+350 Load HSmst(i-1)HSmst(i-1).Visible=True HSmst(i-2).Enabled=False HSmst(i-1).Top=HSmst(i-2).Top+350 Load HSmgt(i-1)HSmgt(i-1).Visible=True HSmgt(i-2).Enabled=False HSmgt(i-1).Top=HSmgt(i-2).Top+350 Load HSw(i-1)HSw(i-1).Visible=True HSw(i-2).Enabled=False HSw(i-1).Top=HSw(i-2).Top+350 Load HSpjw(i-1)HSpjw(i-1).Visible=True HSpjw(i-2).Enabled=False HSpjw(i-1).Top=HSpjw(i-2).Top+350 Next iEnd IfHSQK_ClickEnd Sub,18,含水率试验,Private Sub Command16_Click()On Error Resume NextDim i As Integer For i=HSBH.UBound To 1 Step-1 Unload HSBH(i)Unload HShh(i)Unload HSmh(i)Unload HSmhst(i)Unload HSmhgt(i)Unload HSmst(i)Unload HSmgt(i)Unload HSw(i)Unload HSpjw(i)Next i,控件是不能重复加载的,如需重复加载,可以用错误捕捉也可以先缷载要加载的控件,19,含水率试验,KJSZ(Val(Text54)UShu=Val(Text54)Label66.ForeColor=vbGreenLabel66.FontBold=TrueLabel66.Caption=计算成功,请保存数据Exit Suberr1:Label66.ForeColor=vbRedLabel66.FontBold=TrueLabel66.Caption=计算出错了,请确认是否输入数据有误,注意试样体积和含水率的输入End Sub,函数调用,有两种方法,20,含水率试验,Private Sub HSJS_Click()On Error GoTo err1Dim i As IntegerIf Val(Text54)1 ThenFor i=0 To Val(Text54)-1 HSmst(i)=Format(Val(HSmhst(i)-Val(HSmh(i),#0.000)HSmgt(i)=Format(HSmhgt(i)-HSmh(i),#0.000)HSw(i)=Format(HSmhst(i)-HSmhgt(i)*100/HSmgt(i),#0.000)NextFor i=1 To Val(Text54)If i Mod 2=0 Then If Abs(Val(HSw(i-1)-Val(HSw(i-2)2 Then HSpjw(i-2).ForeColor=vbBlack Else HSpjw(i-2).BackColor=vbRed HSpjw(i-2).FontBold=True End If HSpjw(i-2).Text=(Val(HSw(i-1)+Val(HSw(i-2)/2 Unload HSpjw(i-1)End IfNext,计算含水率的程序,湿土计算,干土计算,含水率计算,含水率差值计算,21,含水率试验,Elsei=0 HSmst(i)=Format(Val(HSmhst(i)-Val(HSmh(i),#0.000)HSmgt(i)=Format(HSmhgt(i)-HSmh(i),#0.000)HSw(i)=Format(HSmhst(i)-HSmhgt(i)*100/HSmgt(i),#0.000)HSpjw(i)=HSw(i)End IfLabel66.ForeColor=vbGreenLabel66.FontBold=TrueLabel66.Caption=计算成功,请保存数据Exit Suberr1:Label66.ForeColor=vbRedLabel66.FontBold=TrueLabel66.Caption=计算出错了,请确认是否输入数据有误 End Sub,提示计算成功还是失败的信息,22,表格法实现方法,Dim Str1 As String,AA()As DoubleSpreadsheet1.Cells(1,1)=盒号Spreadsheet1.Cells(1,2)=m盒(g)Spreadsheet1.Cells(1,3)=m盒湿土(g)Spreadsheet1.Cells(1,4)=m盒干土(g)Spreadsheet1.Cells(1,5)=含水率(%)Spreadsheet1.Cells(1,6)=平均含水率(%)Str1=314,14.414,84.355,75.614;345,14.397,82.576,73.323StrtoShuzhu Str1,AA()Dim I As Integer,J As IntegerFor I=0 To UBound(AA,1)For J=0 To UBound(AA,2)Spreadsheet1.Cells(I+2,J+1)=AA(I,J)把字符串分开填入表格中,以备以后测试用 Next JNext,23,含水率计算,Dim I As Integer,J As Integer,AA()ReDim AA(I-2,2)For I=0 To Spreadsheet1.ActiveSheet.UsedRange.Rows.Count-2 For J=0 To 2 AA(I,J)=Spreadsheet1.Cells(I+2,J+2)读入表格数据 Next J Spreadsheet1.Cells(I+2,5)=Format(AA(I,1)-AA(I,2)/(AA(I,2)-AA(I,0)*100,#.000)含水率 If I=1 And I Mod 2=1 Then Spreadsheet1.Cells(I+2,6)=(Spreadsheet1.Cells(I+2,5)+Spreadsheet1.Cells(I+1,5)/2 End If Next,24,作业 1,添加Microsoft office xp控件用表格法编写含水率或密度计算程序学习用split()和strtoshuzhu()函数把一个字符串转变成数组。有图的请抓图,作业可以是手写版也可以是打印版。,25,密度试验,第三个例题密度求解,26,md md1 md2 md3 md4 md5 md6 md7 md8,27,加载试验组数,Private Sub Text5_Change()Dim i As IntegerIf Val(Text5)10 Then MsgBox 输入数字出错,vbInformation,请重新输入 Exit SubEnd IfIIf Val(Text5)0 Then 加载试验组数 If Val(Text5)MD1.Count Then For i=MD1.ubound+1 To Val(Text5)-1 Load MD1(i):Load MD2(i):Load MD3(i):Load MD4(i)Load MD5(i):Load MD6(i):Load MD7(i)Load MD8(i):MD1(i)=i+1:MD2(i)=423+i,动态加载控件时,每个控件的index属性设置为0,28,加载控件,控件显示位置,MD1(i).Top=MD1(i-1).Top+350 加载后的控件位置 MD2(i).Top=MD2(i-1).Top+350 MD3(i).Top=MD1(i-1).Top+350 MD4(i).Top=MD2(i-1).Top+350 MD5(i).Top=MD1(i-1).Top+350 MD6(i).Top=MD2(i-1).Top+350 MD7(i).Top=MD1(i-1).Top+350 MD8(i).Top=MD2(i-1).Top+350,29,让控件显示在窗体上,MD1(i).Visible=True 显示加载后的控件 MD2(i).Visible=True MD3(i).Visible=True MD4(i).Visible=True MD5(i).Visible=True MD6(i).Visible=True MD7(i).Visible=True MD8(i).Visible=TrueNext,30,当界面上的控件多时,控件的卸载,ElseIf Val(Text5)0 Then Unload MD1(i)Unload MD2(i):Unload MD3(i):Unload MD4(i)Unload MD5(i):Unload MD6(i):Unload MD7(i)Unload MD8(i)End If Next End IfEnd IfMD1(0)=1 这些数据不重要,随便编个号MD2(0)=423End Sub,31,2演示数据,Private Sub MDYS_Click()Dim i As IntegerText5=3 设只有三组试验Text5_Change 事件过程也可直接调用,加载试验组数For i=0 To 2 试验自动编号与环刀自动编号 MD1(i)=i+1 MD2(i)=423+iNextMD3(0)=44.089:MD4(0)=161.605:MD5(0)=60MD6(0)=23.01 第一行数据MD3(1)=41.089:MD4(1)=169.605:MD5(1)=60MD6(1)=22.6MD3(2)=43.089:MD4(2)=169.607:MD5(2)=60MD6(2)=20.6End Sub,32,计算过程1,Private Sub MDJS_Click()Dim i As Integer,K As IntegerDim tmp As Double,Strtmp As StringFor i=0 To Val(Text5)-1 tmp=(Val(MD4(i)-Val(MD3(i)/Val(MD5(i)MD7(i)=Format(tmp,0.#)湿密度 If Val(MD6(i)0 Then tmp=Val(MD7(i)/(1+Val(MD6(i)/100)MD8(i)=Format(tmp,0.#)干密度 End IfNext,33,计算过程2,Strtmp=试样编号,环刀号,刀质量(g),环刀+湿土质量(g),试样体积(cm3),含水率(%),湿密度(g/cm3),干密度(g/cm3)&vbCrLfFor i=0 To Val(Text5)-1Strtmp=Strtmp&MD1(i)&,&MD2(i)&,&MD3(i)&,&MD4(i)&,&MD5(i)&,&MD6(i)&,&MD7(i)&,&MD8(i)&vbCrLfNexttmp=0For i=0 To MD1.ubound tmp=tmp+MD7(i)Next,把输入数据和计算结果以逗号隔开,以便导入Excel中,34,计算过程3,tmp=Format(tmp/MD1.Count,0.#)Strtmp=Strtmp&-&vbCrLfStrtmp=Strtmp&湿密度平均值为,&tmp&g/cm3,tmp=0For i=0 To MD1.ubound 获得控件数组的下标最大值 tmp=tmp+MD8(i)Nexttmp=Format(tmp/MD1.Count,0.#)Strtmp=Strtmp&干密度平均值为,&tmp&g/cm3Text70=Text68&StrtmpEnd Sub,显示到text70中,text70的mutiline属性应设置成true,35,数据格式转换,36,以逗号隔开的数据分割,Private Sub Command31_Click()On Error Resume NextDim AA()As String,bb()As String,i As IntegerIf Text6 Then 分割数据 AA=Split(Text6.Text,vbCrLf)先分行,以回车符分隔End IfText5.Text=UBound(AA)+1:Text5_Change 分配控件数组If Option2(0).Value=True Then 逗号隔开的情况 For i=0 To UBound(AA)If AA(i)Then 不是空行的情况 bb=Split(AA(i),)MD1(i)=bb(0):MD2(i)=bb(1):MD3(i)=bb(2)MD4(i)=bb(3):MD5(i)=bb(4):MD6(i)=bb(5)Else 是空行的情况 Text5=Text5.Text-1 Text5_Change End If Next,37,其它分隔符情况,可以是单空格分隔,也可以是Excel数据复制过来的,其中Excel复制的分隔符是chr(9),是个特殊字符。其余的请仿此程序进行设计。,38,第五个问题 线性插值计算,引言,一维线性插值原理及程序设计,二维线性插值原理及程序设计,结论,39,一、引言,如表1所示,当勘察出来的e指标为0.75,IL指标为0.625时,且有很多组数据需要查表插值时,则计算量较大。在列表中,e最小值为0.5,如果是0.45,则计算者更难着手计算。,40,二、一维线性插值原理及程序设计,41,2.1一维线性插值原理,(1)情况(e1 e3 e2内部插值情况)从图1(a)中可得:ABCADE当f2f1时:当f2f1时,同理,作出相应图可得:,(1),(2),42,2.1一维线性插值原理,情况2(e3 e1外部插值情况)从图1(b)中可得:ABCADE当f2f1时:当f2f1时,同理,作出相应图可得:,(3),(4),43,2.1一维线性插值原理,第三种情况的外插情况,作出相应图形,同理可得,(5),(6),44,2.2线性插值计算的流程图,45,2.3一维线性插值程序,Private Function Chazhi(ByVal e1 As Double,ByVal f1 As Double,ByVal e2 As Double,ByVal f2 As Double,ByVal e3 As Double)注:(e1,f1)与(e2,f2)已知,求e3对应值f3Dim Temp1 As DoubleIf e1=e2 Then Temp1=e1 e1=e2 e2=Temp1 Temp1=f1 f1=f2 f2=Temp1End If,注:设e2e1,否则e1与e2交换,f1与f2交换,46,2.3一维线性插值程序,If e3=e1 And e3=f1 Then Chazhi=(e3-e1)*(f2-f1)/(e2-e1)+f1 Else Chazhi=(e2-e3)*(f1-f2)/(e2-e1)+f2 End IfElseIf e3=f1 Then Chazhi=(e1-e3)*f2-(e2-e3)*f1)/(e1-e2)Else Chazhi=(f1-f2)*(e2-e3)/(e2-e1)+f2 End If,注:内部插值计算,情况1,注:f2=f1的计算方法(1),注:f1f2的计算方法(2),注:外部插值计算,情况2,注:计算方法(3),注:计算方法(4),47,2.3一维线性插值程序,ElseIf e3 e2 Then If f2=f1 Then Chazhi=(f2-f1)*(e3-e1)/(e2-e1)+f1 Else Chazhi=(e3-e1)*f2-(e3-e2)*f1)/(e2-e1)End IfEnd If,注:外部插值计算,情况3,注:计算方法(5),注:计算方法(),48,三、二维线性插值原理及程序设计,3.1二维线性插值原理,49,3.2 二维插值程序设计界面,f3,f6,50,3.3二维插值程序设计,Private Sub Command1_Click()注:Visual Basic事件调用过程Dim Aa1 As Double,Aa2 As Double,Aa3 As Double,Aa4 As DoubleIf Text1=Or Text2=Or Text3=Or Text4=Or Text5=Or Text6=Or _Text7=Or Text8=Or Text9=Or Text10=Then注:Text1为e1,Text2为e2,Text3为IL1,Text4为IL2,Text5为f1,Text6为f2注:Text7为f4,Text8为f5,Text9为e3,Text10为IL3 MsgBox 数字没有输入完全,请重新输入 Exit SubEnd IfAa1=chazhi(Val(Text1),Val(Text5),Val(Text2),Val(Text6),Val(Text9)Aa2=chazhi(Val(Text1),Val(Text7),Val(Text2),Val(Text8),Val(Text9)Aa3=chazhi(Val(Text3),Aa1,Val(Text4),Aa2,Val(Text10)Text11=Aa3 注:把最终计算结果显示到Text11文本框中End Sub,注:根据二维插值原理,用三次一维插值实现,51,3.4程序扩展应用,(1)二维插值计算是基于一维插值的基础上的,所以本程序也可进行单指标插值计算,例如只输入e1,e2,e3,f1,f2,此时就可以计算e3对应的插值指标f0.(2)二维插值计算程序为通用程序,不仅适合于粘性土孔隙比e与IL插值地基承载力的情况,适合于所有具有双指标的插值计算,例如可用于地基应力分布(a/b,l/b)。(3)如果把地基承载力的基本值存到相应的数据库或数据表中,则可以实现完整的地基承载力查表插值计算。,52,4结论与建议,综上所述:(1)介绍了一维线性插值及二维线性插值的基本原理,这有利于对线性插值的理解,所推导出的公式可以直接用于插值运算。(2)设计的二维插值计算程序即可用于普通的单指标插值计算,又可用于普通的双指标插值计算,大大的缩减了计算时间。即本文即有一定的理论学习意义,也有一定的实际应用价值。建议:在此基础上,探讨三维插值与四维插值,以解决更为复杂的插值问题,例如库仑土压力的求解,就涉及到,四个参数查表求值。,