當前位置:商標查詢大全網 - 商標查詢 - 牛頓差分商標和插值公式代碼

牛頓差分商標和插值公式代碼

Dim aa As Double,bb As Double '分別接收findway中根區間兩端的變量。

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

結束功能