Dim x(1)作為Double '分別接收ercigenway的根。
1.0 er求二次方程實根的方法-已測試
private subercigenvay(A為單,B為單,C為單)' A,B,C對應二次方程的系數。
將d調成雙精度
d = b ^ 2 - 4
如果d & lt那麽0
MsgBox“δδ小於0,沒有實根”,“消息”
x(0) = 0: x(1) = 0
那麽ElseIf d = 0
x(0) = -b / (2 * a): x(1) = x(0)
其他
x(0)=(-b-Sgn(b)* Sqr(d))/(2 * a):x(1)= c/(a * x(0))
如果…就會結束
末端接頭
2.1 findway等步長掃描根區間-已測試
Private sub find way (byval a為single,byval b為single,h為double)' a和b為待掃描區間的端點,h為步長。
Dim a1為雙精度
a1 = a
做
if f(a 1)* f(a 1+h)& lt;那麽= 0
aa = a1: bb = a1 + h
出口接頭
如果…就會結束
a1 = a1 + h
循環While a 1 & lt;b
如果a 1 & gt;b那麽
MsgBox "找不到根區間,請嘗試較小的步長"
出口接頭
如果…就會結束
末端接頭
2.2二分分根檢驗
私用函數er fenfun (byval a為single,byval b為single,eps為double)' A和B為有根區間的端點,EPS為誤差。
Dim x0為Double,x1為Double,x2為Double,f0為Double,f1為Double,f2為Double
x1 = a: x2 = b
做
x0 = (x1 + x2) / 2
f0 = f(x0)
如果f0 = 0,則
出口Do
其他
f1 = f(x1): f2 = f(x2)
如果F0 * f 1 & lt;那麽0
x2 = x0
其他
x1 = x0
如果…就會結束
如果…就會結束
Abs(x1 - x2)>時循環;蓄電池
x0 = (x1 + x2) / 2
erfenfun = x0
結束功能
2.4牛頓切線法-經過測試
私有函數Newton fxfun (byvalx0為double,eps為double)為double' x0為附近的根,EPS為誤差。
Dim x1為雙精度型,f0為雙精度型,f1為雙精度型
x1 = x0
做
x0 = x1
F0 = f(x0): f1 = fd(x0) 'fd表示f的導函數。
如果Abs(f 1)& lt;那就eps吧
x1 = x0:退出Do
如果…就會結束
x1 = x0 - f0 / f1
循環直到Abs(x 1-x0)& lt;蓄電池
newtonfxfun = x1
結束功能
2.3 stediedaifun sefensen加速叠代法(方程形式為x-f(x)= 0)-測試。
私有函數stediedaifun (byvalx0 as double,eps1asdouble,eps2asdouble) as double' x0是解析解附近的根,eps1是輸出結果的誤差,eps2是判斷叠代能否繼續的準則。
Dim y為Double,z為Double,x1為Double
x1 = x0
做
x0 = x1
y = f(x0): z = f(y)
如果Abs(z-2 * y+x0)& lt;那麽eps2
MsgBox "為了滿足eps2條件,叠代不能繼續"
退出功能
如果…就會結束
x1 = x0 - (y - x0) ^ 2 / (z - 2 * y + x0)
循環直到Abs(x 1-x0)& lt;eps1
stediedaifun = x1
結束功能
2.5牛頓切線法求解牛頓fxnfun n代數方程-已測試
私有函數Newton fxnfun (a()為single,eps為double,x0為double)為double 'a()分別按降序存儲方程的n個系數,EPS為誤差,x0為就近根。
Dim k為整數,n為整數,f0為雙精度,f1為雙精度,x1為雙精度
n =未綁定(a)
x1 = x0
做
x0 = x1
f0 = a(0): f1 = f0
對於k = 1至n - 1
f0 = a(k) + f0 * x0
f1 = f0 + f1 * x0
下壹個k
f0 = a(n) + f0 * x0
x1 = x0 - f0 / f1
循環直到Abs(x 1-x0)& lt;蓄電池
newtonfxfun = x 1
結束功能
2.6 linecutfun和弦切割方法-經過測試
私有函數line cut fun (byval x0為double,byval x1為double,eps為double,n為long)為double' n為叠代次數的極限,x0和x 1為有根區間的端點,EPS為誤差。
將f0標註為Double,f1標註為Double,f2標註為Double
Dim x2為Double,I為Long
f0 = f(x0): f1 = f(x1)
對於i = 1到n
x2 = x 1-(x 1-x0)* f 1/(f 1-F0)
f2 = f(x2)
如果Abs(F2)& lt;那就eps吧
為...退出
如果…就會結束
x0 = x 1:x 1 = x2:F0 = f 1:f 1 = F2
接下來我
如果i = n + 1,則
MsgBox "所需的計算次數太低,無法滿足精度要求"
如果…就會結束
linecutfun = x2
結束功能
4.1拉格朗日插值多項式-已測試。
私有函數lagrangeczfun (a()為double,byval u為double)為double 'a (1,n)存儲n+1個節點,u為插值點。
Dim i為整數,j為整數,n為整數
Dim l為Double,v為Double
v = 0
n = UBound(a,2)
對於j = 0至n
l = 1#
對於i = 0至n
如果i = j,那麽轉到hulue
l = l * (u - a(0,i)) / (a(0,j) - a(0,I))
hulue:
接下來我
v = v + l * a(1,j)
下壹個j
拉格朗日函數= v
結束功能
4.2牛頓插值法-已測試
私有函數newtonczfun (a()為double,u為double)為double 'a (1,n)存儲n+1個節點,u為插值點。
Dim n為整數,I為整數,j為整數,k為整數
Dim z()為Double,f()為Double,v為Double
n = UBound(a,2)
ReDim z(n),f(n)
對於i = 0至n
z(i) = a(1,I)
接下來我
對於i = 1到n
k = k + 1
對於j = 1到n
f(j) = (z(j) - z(j - 1)) / (a(0,j) - a(0,j - k))
下壹個j
對於j = 1到n
z(j) = f(j)
下壹個j
接下來我
f(0) = a(1,0)
v = 0
對於i = n到0步長-1
v = v * (u - a(0,i)) + f(i)
接下來我
newtonczfun = v
結束功能
4.3 hermiteczfun Hermite插值測試
私有函數Hermiteczfun (a()為double,FD()為double,U為double)為double 'a (1,n)存儲n+1個節點,fd(n)存儲n+1個節點的導數值,U為插值點。
Dim l()為Double,ld()為Double,g()為Double,h()為Double,aim為Double
Dim n為整數,I為整數,j為整數
n =未綁定(a)
ReDim l(n),ld(n),g(n),h(n)
aim = 0
對於i = 0至n
l(i) = 1: ld(i) = 0
對於j = 0至n
如果j = i,那麽轉到hulue
l(i) = l(i) * (u - a(0,j)) / (a(0,i) - a(0,j))
ld(i) = ld(i) + 1 / (a(0,i) - a(0,j))
hulue:
下壹個j
g(i) = (1 + 2 * (a(0,i) - u) * ld(i)) * l(i) * l(i)
h(i) = (u - a(0,i)) * l(i) * l(i)
aim = aim + g(i) * a(1,i) + h(i) * fd(i)
接下來我
hermiteczfun = aim
結束功能
5 . 2 . 1 tixingjfun可變階梯積分法-已測試
私有函數tixingjfff (A為single,B為single,eps為double,M為long)為double 'A和B為積分的上下限,EPS為誤差,M為最大計算次數。
Dim h為Double,t1為Double,t2為Double,t為Double,hh為Double
Dim n As Long: n = 1
h = b - a: t1 = h * (f(a) + f(b)) / 2
做
t = 0
對於i = 1到n
t = t + f(a + (i - 0.5) * h)
接下來我
hh = h * t
t2 = (t1 + hh) / 2
如果Abs(T2-t 1)& lt;eps然後退出Do
t1 = t2: h = h / 2: n = 2 * n
循環直到n & gt2 *米
如果n & gt那麽2 * m
MsgBox“計算次數太少,不符合錯誤要求”
如果…就會結束
tixingjffun = t2
結束功能
5.2.2可變步長辛普森積分法-經過測試
私用函數simplesonjfun(A為single,B為single,eps為double,M為long)為double 'A和B為積分的上下限,EPS為誤差,M為最大計算次數。
Dim n壹樣長,I壹樣長
Dim h為Double,t1為Double,t2為Double,hh為Double,s1為Double,s2為Double
n = 1:h = b-a:t 1 = h *(f(a)+f(b))/2
hh = h *(f((a+b)/2)):s 1 =(t 1+2 * hh)/3
做
n = 2 * n: h = h / 2: t2 = (t1 + hh) / 2
t = 0
對於i = 1到n
t = t + f(a + (i - 0.5) * h)
接下來我
hh = t * h
s2 = (t1 + 2 * hh) / 3
如果Abs(S2-s 1)& lt;eps然後退出Do
t1 = t2: s1 = s2
循環直到n & gtm
如果n & gtM Then MsgBox“計算次數太少,不符合誤差要求”
simpsonjffun = s2
結束功能
5.3龍貝格積分法
私有函數rombergjfun(a為Single,b為Single,eps為Double)為Double
將k表示為整數,n表示為整數,h表示為雙精度
k = 0: n = 1: h = b - a
結束功能
找到壹階導數-已測試
私有函數ds 1 fun(x0為single,eps為double)為double' x0為求導點,EPS為誤差。
Dim h為Double,t1為Double,t2為Double
h = 1:t 1 =(f(x0+h)-f(x0-h))/(2 * h)
h = h/2:T2 =(f(x0+h)-f(x0-h))/(2 * h)
Do While Abs(t2 - t1)>蓄電池
t1 = t2
h = h / 2
t2 = (f(x0 + h) - f(x0 - h)) / (2 * h)
環
ds1fun = t2
結束功能
5 . 5 . 2 ds2fun的二階導數-已測試
私有函數ds 2 fun(x0為single,eps為double) asdouble' x0為導數,EPS為誤差。
Dim h為Double,t1為Double,t2為Double
h = 1:t 1 =(f(x0+h)+f(x0-h)-2 * f(x0))/(h * h)
h = h/2:T2 =(f(x0+h)+f(x0-h)-2 * f(x0))/(h * h)
Do While Abs(t2 - t1)>蓄電池
t1 = t2
h = h / 2
T2 =(f(x0+h)+f(x0-h)-2 * f(x0))/(h * h)
環
ds2fun = t2
結束功能