1、数值积分
(1)在对函数进行积分时,建议使用复化积分,即将积分区域进行分段,对每个小段进行积分,然后将积分结果进行相加即可。
(2)在积分算法的选择上面,我个人比较喜欢龙格算法以及高斯公式构造的算法【PS:对于高斯公式,不必要将节点数设置得太多,两点、三点高斯公式计算结果已经很好】。对于选择什么算法,这个仁者见仁智者见智。
(3)当选择一些积分算法无法得到好的积分结果时,可尝试进行积分域的变换,然后再使用其它算法进行积分。PS:记得以前对一个无限区域进行积分时,变换到有限区域,采用高斯积分,得到了非常好的结果。
(4)如果积分结果依然太差,可尝试截断积分域或者进行相应的积分变换,或者进行分步积分。
(5)积分误差的确定。很多时候,我们无法知道积分结果的正确与否,这时我们迫切希望得到一个误差来度量计算结果。目前,我无法找到一个完美的反映误差的方法,(特别是对那些未知的函数形式),这时一种反映误差的通用方法不失为一种比较好的选择:以前后两次(比如复化积分时,第一次复化100次,第二次复化200次等等)积分结果的相对误差来作为评判积分结果的误差。这种相对误差虽然无法绝对保证计算的正确性,但是绝大部分情况下是可行的。
(6)个人感觉目前的积分技术已经十分成熟,绝大部分函数进行积分难度不是那么大,所以请相信你自己!
2、数值微分
(1)个人感觉数值微分在求解一些初值问题时,还是比较有用的,然而,微分远没有积分发展得那么成熟。
(2)在数值微分当中下面常用的一阶、二阶的三点、五点公式等,个人感觉特别有用
一阶:①
f'(x[0])≈(-3*y[0]+4*y[1] -y[2] )/(2*h)
f'(x[0])≈( 3*y[0]+4*y[-1]-y[-2])/(2*h)
f'(x[0])≈(y[1]-y[-1])/(2*h)
f'(x[0])≈(-25*y[0]+48*y[1] -36*y[2] +16*y[3] -3*y[4] )/(12*h)
f'(x[0])≈( 25*y[0]-48*y[-1]+36*y[-2]-16*y[-3]+3*y[-4])/(12*h)
f'(x[0])≈( -3*y[-1]-10*y[0]+18*y[1] -6*y[2] +y[3] )/(12*h)
f'(x[0])≈( 3*y[1] +10*y[0]-18*y[-1]+6*y[-2]-y[-3])/(12*h)
f'(x[0])≈( y[-2]-8*y[-1]+8*y[1]-y[2])/(12*h)
二阶:①
f''(x[0])≈(y[0]-2*y[1]+y[2])/h^2
f''(x[0])≈(y[-1]-2*y[0]+y[1])/h^2
f''(x[0])≈(y[-2]-2*y[-1]+y[0])/h^2
f''(x[0])≈(2*y[0]-5*y[1] +4*y[2] -y[3] )/h^2
f''(x[0])≈(2*y[0]-5*y[-1]+4*y[-2]-y[-3])/h^2
f''(x[0])≈(35*y[0]-104*y[1] +114*y[2] -56*y[3] +11*y[4] )/(12*h^2)
f''(x[0])≈(35*y[0]-104*y[-1]+114*y[-2]-56*y[-3]+11*y[-4])/(12*h^2)
f''(x[0])≈(11*y[-1]-20*y[0]+6*y[1] +4*y[2] -y[3] )/(12*h^2)
f''(x[0])≈(11*y[1] -20*y[0]+6*y[-1]+4*y[-2]-y[-3])/(12*h^2)
f''(x[0])≈(-y[-2]+16*y[-1]-30*y[0]+16*y[1]-y[2])/(12*h^2)
其中:y[0]=f(x[0]),y[1]=f(x[0]+h),y[2]=f(x[0]+2*h),y[3]=f(x[0]+3*h),y[4]=f(x[0]+4*h),y[-1]=f(x[0]-h),y[-2]=f(x[0]-2*h),y[-3]=f(x[0]-3*h),y[-4]=f(x[0]-4*h)
(3)在直接求一个函数的微分值时,可采用上面的公式,然后根根据不同的步长h来确定值,其中误差可和积分一样,采用前后的相对误差作为反映结果的一种度量。
(4)对于常见的问题,比如二阶微分方程的线性边值问题,可以采用上面的公式设计相应的差分格式,然后对一个对角方程进行求解即可。
(5)对于有特殊需求的微分,可以自行导出相应公式,然后代入相应的问题求解即可,对于常见的一二阶微分问题,可以充分利用上面的公式进行相应的构造!
推荐书籍:1、数值分析简明教程.王超能 2、现代应用数学手册.计算与数值分析卷
参考:
①现代应用数学手册.计算与数值分析卷[M].清华大学出版社,北京,2007:245-250//注意,此版本书上个别公式有误