最近的一项工作就是用vector实现多项式类,这个类需要完成多项式的数据结构的定义以及基本运算,包括加减乘除,前三个还比较容易,对于多项式的除法,因为有除不尽的情况,比如:
计算
其结果是:
明显是除不尽的,但是按照普通的除法去做,余数就会被舍弃,当涉及到求值或者求导时,就会产生极大的误差,尤其是在实现牛顿法求解高次多项式的数值解时,需要计算迭代点的函数值以及导数值,余数的舍弃必然使函数值产生偏差,其导数值也必然不准,也就使最后产生不靠谱的结果。
解决方案有两种思路,也是我自己的思考过程,第一种,我想通过指针的形式将多项式除法的结果和余数都返回,然后在计算函数值和导数值的时候,需要将余数和除数再次相除,这样做确实可以解决问题,但是,前提是需要将被除数,除数区分开,在单次除法的计算中问题不大,但是涉及到复杂函数构成时,就显得困难了。
所以产生了第二种解决方案,就是遇到除法,不去计算结果,而是构造一个结构体,这个结构体有两部分构成,一部分是被除数,一部分是除数,也就是变成分子分母的形式
template<typename T>
struct Div_Poly
{
Poly<T> Numer_Poly; //分子--被除数
Poly<T> Denom_Poly;//分母--除数
}
在涉及除法时,就直接传值操作,而不进行实际的除法运算,求函数值时直接将函数值代入,求导数值时,利用导数的定义
进行计算。
delta_x可以设置为double类型的极小值,比如可以取 0.00000001,自己把握精度。
这部分代码我将传到的github上
文件为demo_4.1.zip
其他为早期版本。
来源:CSDN
作者:凌空的桨
链接:https://blog.csdn.net/baidu_36669549/article/details/103799462