牛顿差分商标和插值公式代码

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

结束功能