数值计算方法大作业课案.docx
《数值计算方法大作业课案.docx》由会员分享,可在线阅读,更多相关《数值计算方法大作业课案.docx(32页珍藏版)》请在冰点文库上搜索。
![数值计算方法大作业课案.docx](https://file1.bingdoc.com/fileroot1/2023-5/15/bb1b3129-2ac4-4bba-8110-4b054fcd319a/bb1b3129-2ac4-4bba-8110-4b054fcd319a1.gif)
数值计算方法大作业课案
目录
第一章非线性方程求根····················3
1.1迭代法······································3
1.2牛顿法······································4
1.3弦截法······································5
1.4二分法······································6
第二章插值·······························7
2.1线性插值····································7
2.2二次插值····································8
2.3拉格朗日插值································9
2.4分段线性插值·······························10
2.5分段二次插值·······························11
第三章数值积分··························13
3.1复化矩形积分法·····························13
3.2复化梯形积分法·····························14
3.3辛普森积分法·······························15
3.4变步长梯形积分法···························16
第四章线性方程组数值法··················17
4.1约当消去法·································17
4.2高斯消去法·································18
4.3三角分解法·································20
4.4雅可比迭代法································21
4.5高斯—赛德尔迭代法··························23
第五章常积分方程数值法··················25
5.1显示欧拉公式法······························25
5.2欧拉公式预测校正法··························26
5.3改进欧拉公式法······························27
5.4四阶龙格—库塔法····························28
数值计算方法
第一章非线性方程求根
1.1迭代法
程序代码:
PrivateSubCommand1_Click()
x0=Val(InputBox("请输入初始值x0"))
ep=Val(InputBox(请输入误差限ep))
f=0
Whilef=0
X1=(Exp(2*x0)-x0)/5
IfAbs(X1-x0)PrintX1
f=1
Else
x0=X1
EndIf
Wend
EndSub
例:
求f(x)=e2x-6x=0在x=0.5附近的根(ep=10-10)
1.2牛顿法
程序代码:
PrivateSubCommand1_Click()
b=Val(InputBox("请输入被开方数x0"))
ep=Val(InputBox(请输入误差限ep))
f=0
Whilef=0
X1=x0-(x0^2-b)/(2*b)
IfAbs(X1-x0)PrintX1
f=1
Else
x0=X1
EndIf
Wend
EndSub
例:
求
的值。
(ep=10-10)
1.3弦截法
程序代码:
PrivateSubCommand1_Click()
x0=Val(InputBox("请输入第一个初始值x0"))
X1=Val(InputBox("请输入第二个初始值x1"))
ep=Val(InputBox("请输入误差限ep"))
f=0
Whilef=0
X2=X1-(X1^8-13)*(X1-x0)/((X1^8-13)-(x0^8-13))
IfAbs(X2-X1)PrintX2
f=1
Else
x0=X1
X1=X2
EndIf
Wend
EndSub
例:
求f(x)=x8-13的正根(初始值x1=1,x2=10,ep=10-10)
1.4二分法
程序代码:
PrivateSubCommand1_Click()
a=Val(InputBox("请输入区间端点a"))
b=Val(InputBox("请输入区间端点b"))
ep=Val(InputBox("请输入误差限ep"))
f=0
Whilef=0
x=(a+b)/2
fx=Exp(-x/7)*(9-2*x)-8
fa=Exp(-a/7)*(9-2*a)-8
Iffx=0Then
f=1
Print"方程的根是",x
Else
Iffa*fx>0Then
a=x
Else
b=x
EndIf
IfAbs(b-a)x=(b+a)/2
f=1
Print"方程的根是",x
EndIf
EndIf
Wend
EndSub
例:
求方程f(x)=e-7/x(9-2x)-8在区间[0,1]内的实根。
(ep=10-10)
第2章插值
2.1线性插值
程序代码:
PrivateSubCommand1_Click()
X0=Val(InputBox("请输入第一个结点X:
"))
Y0=Val(InputBox("请输入第一个结点Y:
"))
X1=Val(InputBox("请输入第二个结点X:
"))
Y1=Val(InputBox("请输入第二个结点Y:
"))
f=0
Whilef=0
x=Val(InputBox("请输入未知点的自变量值X:
"))
L0=(x-X1)/(X0-X1)
L1=(x-X0)/(X1-X0)
y=L0*Y0+L1*Y1
Print"x=";x,"y=";y
f=Val(InputBox("是否继续(0/1):
"))
Wend
EndSub
例:
已知两点(13,1)、(49,8),求30处的值。
2.2二次插值
程序代码:
PrivateSubCommand1_Click()
X0=Val(InputBox("请输入第一个结点X:
"))
Y0=Val(InputBox("请输入第一个结点Y:
"))
X1=Val(InputBox("请输入第二个结点X:
"))
Y1=Val(InputBox("请输入第二个结点Y:
"))
X2=Val(InputBox("请输入第三个结点X:
"))
Y2=Val(InputBox("请输入第三个结点Y:
"))
f=0
Whilef=0
x=Val(InputBox("请输入未知点的自变量值X:
"))
L0=(x-X1)*(x-X2)/(X0-X1)/(X0-X2)
L1=(x-X0)*(x-X2)/(X1-X0)/(X1-X2)
L2=(x-X0)*(x-X1)/(X2-X0)/(X2-X1)
y=L0*Y0+L1*Y1+L2*Y2
Print"x=";x,"y=";y
f=Val(InputBox("是否继续(0/1):
"))
Wend
EndSub
例:
已知三点(81,9)、(100,10)、(121,10),求98处的值。
2.3拉格朗日插值
程序代码:
PrivateSubCommand1_Click()
Dimx(),y()
n=Val(InputBox("请输入插值节点数N"))
ReDimx(n),y(n)
Fori=0Ton
x(i)=Val(InputBox("请输入插值节点x("+Str(i)+")"))
y(i)=Val(InputBox("请输入插值节点y("+Str(i)+")"))
Nexti
f=0
Whilef=0
xx=Val(InputBox("请输入未知点的自变量x:
"))
Sum=0
Fori=0Ton
t=1
Forj=0Ton
Ifj<>iThen
t=t*(xx-x(j))/(x(i)-x(j))
EndIf
Nextj
Sum=Sum+t*y(i)
Nexti
Print"x=";xx,"y=";Sum
f=Val(InputBox("是否继续(0/1)"))
Wend
EndSub
例:
已知四点(100,10)、(81,9)、(64,8)、(49,7),求87处的值。
2.4分段线性插值
程序代码:
PrivateSubCommand1_Click()
Dimx(),y()
n=Val(InputBox("请输入插值节点数N"))
ReDimx(n),y(n)
Fori=0Ton
x(i)=Val(InputBox("请输入插值节点x("+Str(i)+")"))
y(i)=Val(InputBox("请输入插值节点y("+Str(i)+")"))
Nexti
f=0
Whilef=0
xx=Val(InputBox("请输入未知点的自变量x:
"))
L=0
j=1
WhileL=0
Ifxxk=j+1
L=1
Else
j=j+1
Ifj>n-1Then
k=n-1
L=1
EndIf
EndIf
Wend
l0=(xx-x(k))/(x(k-1)-x(k))
l1=(xx-x(k-1))/(x(k)-x(k-1))
yy=l0*y(k-1)+l1*y(k)
Print"x=";xx,"y=";yy
f=Val(InputBox("是否继续(0/1)"))
Wend
EndSub
例:
已知三点(361,19)、(324,18)、(289,17),N=2,求300处的值。
2.5分段二次插值
程序代码:
PrivateSubCommand1_Click()
Dimx(),y()
n=Val(InputBox("请输入插值节点数N"))
ReDimx(n),y(n)
Fori=0Ton
x(i)=Val(InputBox("请输入插值节点x("+Str(i)+")"))
y(i)=Val(InputBox("请输入插值节点y("+Str(i)+")"))
Nexti
f=0
Whilef=0
xx=Val(InputBox("请输入未知点的自变量x:
"))
Ifx0(1)Then
k=1
f=1
EndIf
i=2
DoWhilef=0Andi>=n-1
Ifx0Ifx0-x(i-1)k=i-1
f=1
Else
k=i
f=1
EndIf
Else
i=i+1
EndIf
Loop
Iff=0Then
k=n-1
EndIf
l1=(xx-x(k+1))*(xx-x(k))/((x(k-1)-x(k+1))*(x(k-1)-x(k)))
l2=(xx-x(k+1))*(xx-x(k-1))/((x(k)-x(k+1))*(x(k)-x(k-1)))
l3=(xx-x(k))*(xx-x(k-1))/((x(k+1)-x(k))*(x(k+1)-x(k-1)))
yy=l1*y(k-1)+l2*y(k)+l3*y(k+1)
Print"x=";xx,"y=";yy
f=Val(InputBox("是否继续(0/1)"))
Wend
EndSub
例:
已知三点(225,15)、(196,14)、(169,13),求180处的值。
第3章数值积分
3.1复化矩形积分法
程序代码:
PrivateSubCommand1_Click()
a=Val(InputBox("请输入积分下限a"))
b=Val(InputBox("请输入积分上限b"))
n=Val(InputBox("请输入积分区间等分数N"))
h=(b-a)/n
Sum=0
Fori=1Ton
Sum=Sum+(a+(i-0.5)*h)^2
Nexti
r=h*Sum
Print"复化矩形积分法计算结果:
";r
EndSub
例:
求X2在区间[3,5]的积分值,等分区间为100。
3.2复化梯形积分法
程序代码:
PrivateSubCommand1_Click()
a=Val(InputBox("请输入积分下限a"))
b=Val(InputBox("请输入积分上限b"))
n=Val(InputBox("请输入积分区间等分数N"))
h=(b-a)/n
Sum=0
Fori=1Ton-1
Sum=Sum+(a+i*h)^2
Nexti
t=h*(a^2+b^2)/2+h*Sum
Print"复化梯形积分法计算结果:
";t
EndSub
例:
求X2在区间[3,5]的积分值,等分区间为100。
3.3辛普生积分法
程序代码:
PrivateSubCommand1_Click()
a=Val(InputBox("请输入积分下限A:
"))
b=Val(InputBox("请输入积分上限B:
"))
n=Val(InputBox("请输入积分区间等分数N:
"))
h=(b-a)/n
Sum=0
w=a+h/2
Whilew
Sum=Sum+(w-h/2)^2+4*w^2+(w+h/2)^2
w=w+h
Wend
s=Sum*h/6
Print"辛普生积分法计算结果:
";s
EndSub
例:
求X2在区间[3,5]的积分值,等分区间为100。
3.4变步长梯形积分法
程序代码:
PrivateSubCommand1_Click()
a=Val(InputBox("请输入积分下限a:
"))
b=Val(InputBox("请输入积分上限b:
"))
ep=Val(InputBox("请输入误差限ep:
"))
n=1
h=b-a
t1=h*(a^2+b^2)/2
f=0
Whilef=0
Sum=0
Fori=1Ton-1
Sum=Sum+(a+(i-1/2)*h)^2
Nexti
T2=t1/2+h*Sum/2
IfAbs(T2-t1)PrintT2
f=1
Else
t1=T2
h=h/2
n=2*n
EndIf
Wend
EndSub
例:
求X2在区间[3,5]的积分值,误差限ep=0.0001。
第4章线性方程组数值解法
4.1约当消去法
程序代码:
PrivateSubCommand1_Click()
Dima()
n=Val(InputBox("请输入方程的个数N:
"))
ReDima(n,n+1)
Fori=1Ton
Forj=1Ton+1
a(i,j)=Val(InputBox("请输入增广矩阵A("+Str(i)+","+Str(j)+")="))
Nextj
Nexti
Fork=1Ton
m=a(k,k)
Forj=kTon+1
a(k,j)=a(k,j)/m
Nextj
Fori=1Ton
Ifi<>kThen
m=a(i,k)
Forj=kTon+1
a(i,j)=a(i,j)-a(k,j)*m
Nextj
EndIf
Nexti
Nextk
Fori=1Ton
Print"x("+Str(i)+")=";a(i,n+1)
Nexti
EndSub
例:
已知方程组,求X1X2X3的值。
X1+X2+X3=20
2X1+3X2+X3=38
X1+4X2+X3=35
4.2高斯消去法
程序代码:
PrivateSubCommand1_Click()
Dima(),x()
n=Val(InputBox("请输入方程个数N:
"))
ReDima(n,n+1),x(n)
Fori=1Ton
Forj=1Ton+1
a(i,j)=Val(InputBox("请输入增广矩阵A("+Str(i)+","+Str(j)+"):
"))
Nextj
Nexti
Fork=1Ton-1
m=a(k,k)
Forj=kTon+1
a(k,j)=a(k,j)/m
Nextj
Fori=k+1Ton
m=a(i,k)
Forj=kTon+1
a(i,j)=a(i,j)-a(k,j)*m
Nextj
Nexti
Nextk
x(n)=a(n,n+1)/a(n,n)
Fori=n-1To1Step-1
Sum=0
Forj=i+1Ton
Sum=Sum+a(i,j)*x(j)
Nextj
x(i)=a(i,n+1)-Sum
Nexti
Fori=1Ton
Print"x("+Str(i)+")=";x(i)
Nexti
EndSub
例:
已知方程组,求X1X2X3的值。
2X1+5X2+X3=21
4X1+3X2+3X3=31
X1+3X2+2X3=16
4.3三角分解法
程序代码:
PrivateSubCommand1_Click()
Dima(),b(),l(),u(),x(),y()
n=Val(InputBox("请输入方程个数N:
"))
ReDima(n,n),b(n),l(n,n),u(n,n),x(n),y(n)
Fori=1Ton
Forj=1Ton
a(i,j)=Val(InputBox("请输入系数矩阵A("+Str(i)+","+Str(j)+"):
"))
Nextj
b(i)=Val(InputBox("请输入右端常数项B("+Str(i)+"):
"))
Nexti
Fori=1Ton
Forj=1Ton
Ifi>jThen
Sum=0
Fork=1Toj-1
Sum=Sum+l(i,k)*u(k,j)
Nextk
l(i,j)=(a(i,j)-Sum)/u(j,j)
Else
Sum=0
Fork=1Toi-1
Sum=Sum+l(i,k)*u(k,j)
Nextk
u(i,j)=a(i,j)-Sum
EndIf
Nextj
Nexti
Fori=1Ton
Sum=0
Forj=1Toi-1
Sum=Sum+l(i,j)*y(j)
Nextj
y(i)=b(i)-Sum
Nexti
Fori=nTo1Step-1
Sum=0
Forj=i+1Ton
Sum=Sum+u(i,j)*x(j)
Nextj
x(i)=(y(i)-Sum)/u(i,i)
Nexti
Fori=1Ton
Print"x("+Str(i)+")=";x(i)
Nexti
EndSub
例:
已知方程组,求X1X2X3的值。
2X1+3X2+4X3=38
X1+7X2+3X3=65
5X1+2X2+X3=33
4.4雅可比迭代法
程序代码:
Dima(),b(),x0(),x()
n=Val(InputBox("请输入方程个数N:
"))
ReDima(n,n),b(n),x0(n),x(n)
ep=Val(InputBox("请输入误差限EP:
"))
nmax=Val(InputBox("请输入最大迭代次数Nmax:
"))
Fori=1Ton
Forj=1Ton
a(i,j)=Val(InputBox("请输入系数矩阵A("+Str(i)+","+Str(j)+"