数值计算编程20个.docx
《数值计算编程20个.docx》由会员分享,可在线阅读,更多相关《数值计算编程20个.docx(25页珍藏版)》请在冰豆网上搜索。
数值计算编程20个
1、P11,第一题
PrivateSubForm_Click()
Dima,b,x,sAsDouble
a=1
b=2
s=0.001
Do
x=(a+b)/2
If(x^3-x-1)*(a^3-a-1)<0Then
b=x
Else
a=x
EndIf
LoopUntilAbs(x^3-x-1)
Printx
Printx^3-x-1
EndSub
结果:
1.
2、P12,第五题
PrivateSubForm_Click()
Dima,x,sAsDouble
a=8
s=0.001
x=a
Do
p=x
x=(p+a/p)/2
LoopUntilAbs(x-p)
Printx
EndSub
结果:
2.986
3、程序:
PrivateSubForm_Click()
DimiAsInteger
Dimt,a(0To3),pAsDouble
t=2
Fori=0To3
a(i)=InputBox("x("&i&")=")
Nexti
p=a(3)
Fori=2To0Step-1
p=p*t+a(i)
Nexti
Printp
EndSub
结果:
49
4、程序:
PrivateSubForm_Click()
Dima,b,sAsDouble
a=0.2
b=1.34
s=(a+b)/2
Do
Ifa*(1-a)*s*(1-s)<0Then
b=s
Else
a=s
EndIf
s=(a+b)/2
LoopUntilb-a<0.01
Prints
EndSub
结果:
0.997109375
5、程序:
PrivateSubForm_click()
Dimx,s,pAsDouble
DimiAsInteger
x=101
s=10
p=1/2/10
i=1
Do
s=s+p
p=p/2*(-1)/100*(2*i-1)
i=i+1
LoopUntilp<0.01
Prints
EndSub
结果:
10.05
6、拉格朗日:
PrivateSubForm_Click()
Dimi,j,nAsInteger
Dimx(1To100),y(1To100),p,s,tAsDouble
t=2.5
n=3
Fori=1Ton
x(i)=InputBox("x("&i&")=")
y(i)=InputBox("y("&i&")=")
Nexti
s=0
Fori=1Ton
p=1
Forj=1Ton
Ifi<>jThen
p=p*(t-x(j))/(x(i)-x(j))
EndIf
Nextj
s=s+p*y(i)
Nexti
Prints
EndSub
结果:
6
7、课堂埃尔米特插值程序:
PrivateSubForm_Activate()
Dimx0,y0,x1,y1,g0,g1AsDouble
x0=0
y0=0
x1=1
y1=1
g0=0
g1=2
x=0.5
a0=-2/(x0-x1)^3
b0=1/(x0-x1)^2+2*x0/(x0-x1)^3
a1=-2/(x1-x0)^3
b1=2*x1/(x1-x0)^3+1/(x1-x0)^2
k0=1/(x0-x1)^2
k1=1/(x1-x0)^2
l0=(x-x1)^2*(a0*x+b0)
l1=(x-x0)^2*(a1*x+b1)
gg0=k0*(x-x0)*(x-x1)^2
gg1=k1*(x-x0)^2*(x-x1)
y=l0*y0+l1*y1+gg0*g0+gg1*g1
Printy
EndSub
结果:
0.25
8、第一个:
样条函数:
PrivateSubForm_Activate()
Dimx(3),y(3),m0,m1,m2AsDouble
DimiAsInteger
Fori=0To2
x(i)=i
y(i)=i*i
Nexti
m0=0
m2=4
h0=x
(1)-x(0)
h1=x
(2)-x
(1)
a=2/h0
b=4/h0+4/h1
c=2/h1
d=(-6*y
(1)+6*y
(2))/h1^2-(6*y(0)-6*y
(1))/h0^2
m1=(d-a*m0-c*m2)/b
Printm1
EndSub
结果:
2
9、牛顿插值:
DimkAsInteger
PrivateSubCombo1_Click()
DimiAsInteger
k=CInt(Combo1.Text)
Fori=0To9
Text1(2*i).Visible=False
Text1(2*i+1).Visible=False
Label(i).Visible=False
Nexti
Fori=0Tok-1
WithLabel(i)
.Visible=True
.Top=1560+400*i
.Caption="第"&i+1&"点:
"
.Left=120
EndWith
WithText1(2*i)
.Visible=True
.Left=800
.Top=1500+400*i
EndWith
WithText1(2*i+1)
.Visible=True
.Left=1500
.Top=1500+400*i
EndWith
Nexti
EndSub
PrivateSubCommand1_Click()
DimiAsInteger
DimsAsDouble
s=0
Fori=0Tok-1
s=s+ff(i)*f1(Text3.Text,i)
Nexti
Text2.Text=s
EndSub
PrivateSubCommand2_Click()
End
EndSub
PrivateSubForm_Load()
DimiAsInteger
Fori=2To10
Combo1.AddItemi
Nexti
EndSub
Functionff(ByValnAsInteger)
DimiAsInteger
DimsAsDouble
s=0
Ifn=0Then
ff=Text1
(1).Text
ExitFunction
EndIf
Fori=0Ton
s=s+Text1(2*i+1).Text/f(i,n)
Nexti
ff=s
EndFunction
Functionf(ByValpAsInteger,ByValnAsInteger)
DimiAsInteger
DimsAsDouble
s=1
Fori=0Ton
Ifi<>pThen
s=s*(Text1(2*p).Text-Text1(2*i).Text)
EndIf
Nexti
f=s
EndFunction
Functionf1(ByValxAsDouble,ByValnAsInteger)
DimiAsInteger
DimsAsDouble
Ifn=0Then
f1=1
ExitFunction
EndIf
s=1
Fori=0Ton-1
s=s*(x-Text1(2*i).Text)
Nexti
f1=s
EndFunction
结果:
带入(1,1),(2,4),(3,7),(4,8),(5,6)得到变量为3.5时,插值结果为7.8359375
10、复化辛普生算法:
PrivateSubCommand1_Click()
Dimi,nAsInteger
Dims,h,xAsDouble
a=InputBox("请输入左端点a:
")
b=InputBox("请输入右端点b:
")
n=InputBox("请输入分段数n:
")
h=(b-a)/n
s=f(b)-f(a)
x=a
Fori=1Ton
x=x+h/2
s=s+4*f(x)
x=x+h/2
s=s+2*f(x)
Nexti
s=h/6*s
Text1.Text=s
EndSub
Functionf(ByValxAsDouble)
Ifx=0Then
f=1
ExitFunction
EndIf
f=Sin(x)/x
EndFunction
结果:
当输入区间为(0,1),分8段,运行结果是0.1943
11、p153第6题
PrivateSubForm_Load()
Dims,t,eAsDouble
Dimi,kAsInteger
t=0
k=0
s=(t+2)^0.5
e=0.001
Fori=0To20
IfAbs(s-t)k=1
ExitFor
EndIf
t=s
s=(t+2)^0.5
Nexti
Text1.Text=s
EndSub
结果:
1.829
12、p154第18题
DimaAsDouble
PrivateSubForm_Load()
Dimx0,x,eAsDouble
DimiAsInteger
x=5
e=0.000001
a=InputBox("a=")
Fori=0To20
x0=x
Text1.Text=Text1.Text&vbCrLf&f1(x0)
Iff1(x0)=0Then
ExitFor
EndIf
x=x0-f(x0)/f1(x0)
IfAbs(x-x0)ExitFor
EndIf
Nexti
Ifi=20Then
MsgBox"迭代失败!
"
End
EndIf
Text1.Text=x
EndSub
Functionf(ByValxAsDouble)
f=x^3-a
EndFunction
Functionf1(ByValxAsDouble)
f1=3*x^2
EndFunction
结果:
2.188
13、p155第24题牛顿法
PrivateSubForm_Load()
Dimx0,eAsDouble
DimiAsInteger
x0=0
e=0.000001
n=20
Iff1(x0)=0Then
MsgBox"奇异"
End
EndIf
Fori=oTo20
x0=x
Iff1(x)=0Then
MsgBox"奇异"
End
EndIf
x=x0-f(x0)/f1(x0)
IfAbs(x-x0)ExitFor
EndIf
Nexti
Ifi=20Then
MsgBox"迭代失败!
"
End
EndIf
Text1.Text=x
EndSub
Functionf(ByValxAsDouble)
f=x^3+2*x^2+10*x-20
EndFunction
Functionf1(ByValxAsDouble)
f1=3*x^2+4*x+10
EndFunction
结果:
1.137
14、p155第24题弦截法
PrivateSubForm_Load()
Dimx0,x1,eAsDouble
DimiAsInteger
x0=0
e=0.000001
n=20
Iff1(x0)=0Then
MsgBox"奇异"
End
EndIf
x1=x0-f(x0)/f1(x0)
Fori=oTo20
x=x1-f(x1)/(f(x1)-f(x0))*(x1-x0)
IfAbs(x-x1)ExitFor
EndIf
x1=x
Nexti
Ifi=20Then
MsgBox"迭代失败!
"
End
EndIf
Text1.Text=x
EndSub
Functionf(ByValxAsDouble)
f=x^3+2*x^2+10*x-20
EndFunction
Functionf1(ByValxAsDouble)
f1=3*x^2+4*x+10
EndFunction
结果:
1.562
15、p155第24题快速弦截法
PrivateSubForm_Load()
Dimx0,x1,eAsDouble
DimiAsInteger
x0=0
e=0.000001
n=20
Iff1(x0)=0Then
MsgBox"奇异"
End
EndIf
x1=x0-f(x0)/f1(x0)
Fori=oTo20
x0=x1
x1=x
x=x1-f(x1)/(f(x1)-f(x0))*(x1-x0)
IfAbs(x-x1)ExitFor
EndIf
Nexti
Ifi=20Then
MsgBox"迭代失败!
"
End
EndIf
Text1.Text=x
EndSub
Functionf(ByValxAsDouble)
f=x^3+2*x^2+10*x-20
EndFunction
Functionf1(ByValxAsDouble)
f1=3*x^2+4*x+10
EndFunction
结果:
1.496
16、消去法
DimnAsInteger
Dima(1To10,1To10),b(1To10),x(1To10)AsDouble
PrivateSubCombo1_Click()
Dimi,jAsInteger
Fori=1To100
Text1(i).Visible=False
Nexti
Fori=1To10
Text2(i).Visible=False
Text3(i).Visible=False
Nexti
n=Combo1.Text
Fori=1Ton
Forj=1Ton
WithText1((i-1)*n+j)
.Visible=True
.Top=500*i+200
.Left=500*j
.Height=300
EndWith
Nextj
WithText2(i)
.Visible=True
.Top=500*i+200
.Left=500*n+800
.Height=300
EndWith
WithText3(i)
.Visible=True
.Top=500*i+200
.Left=500*n+1800
.Width=700
.Height=300
EndWith
Nexti
EndSub
PrivateSubCommand1_Click()
Dimi,j,kAsInteger
Dims,rAsDouble
Fori=1Ton
Forj=1Ton
a(i,j)=Text1((i-1)*n+j).Text
Nextj
b(i)=Text2(i).Text
Nexti
Fori=1Ton-1
Forj=i+1Ton
r=a(j,i)/a(i,i)
Fork=iTon
a(j,k)=a(j,k)-r*a(i,k)
Nextk
b(j)=b(j)-r*b(i)
Nextj
Nexti
Fori=nTo1Step-1
s=b(i)
Ifi<>nThen
Forj=iTon
s=s-a(i,j)*x(j)
Nextj
EndIf
x(i)=s/a(i,i)
Text3(i).Text=x(i)
Nexti
EndSub
PrivateSubCommand2_Click()
End
EndSub
PrivateSubForm_Load()
DimiAsInteger
Fori=2To10
Combo1.AddItemi
Nexti
EndSub
结果:
选择求解未知数个数为3,再依次输入A={2,-1,3;4,2,5;1,2,0;}B={1,4,7;}得到x={9,-1,-6}
17、追赶法
PrivateSubCommand1_Click()
Dimi,j,kAsInteger
Dimaa(1To4),bb(1To4),cc(1To4),dd(1To4),xx(1To4),g(1To4),f(1To4)AsDouble
Dims,rAsDouble
Fori=1To4
Ifi=1Then
aa(i)=0
Else
aa(i)=a(i).Text
EndIf
bb(i)=b(i).Text
Ifi=4Then
cc(i)=0
Else
cc(i)=c(i).Text
EndIf
dd(i)=d(i).Text
Nexti
g
(1)=dd
(1)/bb
(1)
f
(1)=-cc
(1)/bb
(1)
Fori=2To4
g(i)=(dd(i)-aa(i)*g(i-1))/(aa(i)*f(i-1)+bb(i))
f(i)=-cc(i)/(aa(i)*f(i-1)+bb(i))
Nexti
xx(4)=g(4)
x(4).Text=xx(4)
Fori=3To1Step-1
xx(i)=g(i)+f(i)*xx(i+1)
x(i).Text=xx(i)
Nexti
EndSub
PrivateSubCommand2_Click()
End
EndSub
结果:
依次输入方程组系数A={1,1;1,2,1;1,2,3;1,2;},B={3,8,20,11}得到结果为X={1,2,3,4;}
18、高斯-赛德尔程序如下:
PrivateSubCommand1_Click()
Dimi,jAsInteger
Dimk,t(1To3),s,a(1To3,1To3),b(1To3),x(1To3)AsDouble
Fori=1To3
Forj=1To3
a(i,j)=Text1(i*3+j-3).Text
Nextj
b(i)=Text2(i).Text
x(i)=0
Nexti
k=1
DoUntilk<0.0001
Fori=1To3
s=b(i)
Forj=1To3
Ifj<>iThen
Text4.Text=s
s=s-a(i,j)*x(j)
Text5.Text=s
EndIf
Nextj
t(i)=s/a(i,i)
Ifi=1Then
k=Abs(t(i)-x(i))
ElseIfAbs(t(i)-x(i))>kThen
k=Abs(t(i)-x(i))
EndIf
x(i)=t(i)
Nexti
Loop
Fori=1To3
Text3(i).Text=x(i)
Nexti
EndSub
运行结果:
输入系数A={7,5,-3;5,7,1;2,1,7;}B={2,4,-11}得到X={-1.727,2.000,-1.363}
19、迭代法程序如下:
PrivateSubCommand1_Click()
Dimi,jAsInteger
Dimk,t(1To3),s,a(1To3,1To3),b(1To3),x(1To3)AsDouble
Fori=1To3
Forj=1To3
a(i,j)=Text1(i*3+j-3).Text
Nextj
b(i)=Text2(i).Text
x(i)=0
Nexti
k=1
DoUntilk