牛顿差分商标和插值公式代码
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
结束功能