【数学/多项式】用列表去实现一元多项式函数的四则运算,和它的n阶导数的Python算法实现

目录

前言

一元多项式函数

一元多项式函数的n阶导数

一元多项式函数的加减法

一元多项式函数的乘法

完全代码

运行结果

总结


前言

     这篇文章将主要讲述如何用代码去实现,初等数学里面的一元多项式环相关的问题,编程所用的语言虽然是Python,但设计代码的思想是不受具体的某一门语言的限制的,我们只要掌握了实现它的核心思想,是很容易就可以将它迁移到另外一门语言的。本篇文章后续将会收录到数值分析方程求解相关问题的专栏里面,在后续接下来的文章,我会介绍一些基础的数学算法在代码上的实现,当我们掌握了这些足够多的数学知识后,我将会叙述如何用代码去寻找这些函数(方程)的近似根。最后一句话送给你们,做学问最忌讳的就是心浮气躁,技术需要时间沉淀,只有放下浮躁的心来,踏踏实实,认认真真地去做一件事,我们才会收获到更有价值的东西。

一元多项式函数

      所谓一元多项式函数就是形如:f(x)=a_{n}x^{n}+a_{n-1}{}x^{n-1}+a_{n-2}x^{n-2}+...+a_{1}x+a_{0} 

其中,a_{i} \epsilon R,满足这样的形式的函数我们就称其为,一元多项式函数,用符号简记为F[x],在开始编程中,这些系数我们可以用一个列表去表示,[a_{n}^{},a_{n-1},a_{n-2},...,a_{1},a_{0}]。例如,对于

f(x)=x^{3}+4x^{2}-7x+7,我们可以用[1,4,-7,7]去表示该多项式。

     那么我们如何根据列表去计算这个多项式函数在某一点x的值呢?实现代码如下:

def polyf(a0,list,x):
    #a0代表我们要求的是几阶导数,list是多项式的系数列表,x是多项式函数在某一点的值
    y=0    #保存原函数的值
    y1=0   #保存导函数的值
    list1=[]
    n=len(list)

    if a0==0:   #我们首先研究的是它的原函数,这里用a0=0去表示原函数
        for i in range(n):   #用循环去遍历列表中各项多项式的系数,
            y+=list[i]*x**(n-i-1)   #并用y去保存累加后的各项在x的值
        return y   

一元多项式函数的n阶导数

     上诉代码比较好理解,接下来就是我们如何根据多项式的系数列表,去求它的n阶多项式函数在某一点x的值。其实现代码如下:

#代码继上文中的polyf()

    if a0!=0:
        if a0>n-1:   #我们知道对于元素为n的系数列表,其最多有n—1阶导数,
            return   #当a>n-1时,我们直接结束该方法  


        j=0 
        list0=[1 for i in range(n-a0)]    
        for i in range(n-a0):
            while j                 list0[i]*=(n-1-i-j)
                j+=1
            j=0
            list1.append(list[i]*list0[i])   #通过循环计算n阶导函数的系数列表


        y1=polyf(0,list1,x)
        return y1    #得到导函数的系数列表后,我们再次调用polyf()方法,就可以得到导函数在x上的值

一元多项式函数的加减法

     当前面已经介绍了如何通过一元多项式函数的系数列表,去求得它的N阶导数。其中,理解代码中的循环去计算N阶导数的列表属实是不容易的。接下来,我将要介绍如何通过两个多项式系数列表去计算它们的和或差。这里的内容将会比较好理解,相信你也有了一些如何去实现它的思路,其实现代码如下:

def polyring(list1,str,list2):
    list3=[]
    n1=len(list1)
    n2=len(list2)
    l=abs(n2-n1)


    if str=='+' or '-':
        if n1>=n2:     #因为我们操作的两个列表长度有大有小,因此我们需要将其进行分两种情况讨论
            for j in range(l):
                list3.append(list1[j])   #这里我们将高次系数直接插入到list3中,因为它们不需要参与加减法计算


            for i in range(n2):   #对于剩下要参加运算的列表元素,根据条件去判断,是执行“+”还是“-”运算
                if str=='+':
                    list3.append(list1[l+i]+list2[i])
                if str=='-':
                    list3.append(list1[l+i]-list2[i]) #由于append()方法是从列表尾部插入,所以我们必须按元素的顺序进行调用该函数
            return list3 


        else:     #同理,不再论述
            for j in range(l):
                if str=='+':
                    list3.append(list2[j])
                if str=='-':
                    list3.append(-list2[j])
            for i in range(n1):
                if str=='+':
                    list3.append(list2[l+i]+list1[i])
                if str=='-':
                    list3.append(list1[i]-list2[l+i])
            return list3

一元多项式的乘法

     上面我们已经学习到了一元多项式函数的加减法运算,多项式的加减法运算学习起来还是比较轻松的,毕竟好理解多了,相较于一元多项式的n阶导函数的计算。接下来,我们就要稍稍加加速了,下面我将要介绍,一元多项式的乘法。实现代码如下:

#代码继上文中的polyring()
if str=='*':
        array=[0 for i in range(2*max(n1,n2)-1)]
        list3=[]
        i=0;j=0


        if n1>=n2:      
            for i in range(l):  
                list2.insert(i,0)     #将两个多项式列表转化相同的项数来处理

            while i<=2*n1-2:    #外层大循环,列表元素个数为n时,两个同型多项式相乘最多有2n-1项      
                while (i+1<=n1) and (j<=i):
                    array[i]+=list1[j]*list2[i-j]
                    j+=1
                while (i+1>n1) and (j<=(2*n1-2-i)):     #这里根据多项式相乘所得结果的数学结构,分解为两个部分,在分别用循环去求解这两个部分
                    array[i]+=list1[(i-n1)+j+1]*list2[n1-1-j]                                  
                    j+=1
                i+=1;j=0
            

            for i in range(len(array)):
                if array[i]==0:
                    continue
                else:
                    for j in range(len(array)-i):
                        list3.append(array[j+i])
                break
            return list3    #消除列表前面为0的项,即化简该系数列表       
 

        else:   #同理,不再叙述
            for i in range(l):
                list1.insert(i,0)
            while i<=2*n2-2:          
                while (i+1<=n2) and (j<=i):
                    array[i]+=list2[j]*list1[i-j]
                    j+=1
                while (i+1>n2) and (j<=(2*n2-2-i)): 
                    array[i]+=list2[(i-n2)+j+1]*list1[n2-1-j]                                  
                    j+=1
                i+=1;j=0

            for i in range(len(array)):
                if array[i]==0:
                    continue
                else:
                    for j in range(len(array)-i):
                        list3.append(array[j+i])
                break
            return list3  

完全代码

def polyf(a0,list,x):  
    y=0   
    y1=0   
    list1=[]
    n=len(list)

    if a0==0:   
        for i in range(n):  
            y+=list[i]*x**(n-i-1)   
        return y   


    if a0!=0:
        if a0>n-1:  
            return    
        j=0 
        list0=[1 for i in range(n-a0)]    
        for i in range(n-a0):
            while j                 list0[i]*=(n-1-i-j)
                j+=1
            j=0
            list1.append(list[i]*list0[i])   

        for i in range(n-a0):
            y1+=list1[i]*x**(n-a0-i-1)
        return y1    

def polyring(list1,str,list2):
    list3=[]
    n1=len(list1)
    n2=len(list2)
    l=abs(n2-n1)


    if str=='+' or '-':
        if n1>=n2:
            for j in range(l):
                list3.append(list1[j])
            for i in range(n2):
                if str=='+':
                    list3.append(list1[l+i]+list2[i])
                if str=='-':
                    list3.append(list1[l+i]-list2[i])
            return list3 
        else:
            for j in range(l):
                if str=='+':
                    list3.append(list2[j])
                if str=='-':
                    list3.append(-list2[j])
            for i in range(n1):
                if str=='+':
                    list3.append(list2[l+i]+list1[i])
                if str=='-':
                    list3.append(list1[i]-list2[l+i])
            return list3


    if str=='*':
        array=[0 for i in range(2*max(n1,n2)-1)]
        list3=[]
        i=0;j=0
        if n1>=n2:      
            for i in range(l):
                list2.insert(i,0)
            while i<=2*n1-2:            
                while (i+1<=n1) and (j<=i):
                    array[i]+=list1[j]*list2[i-j]
                    j+=1
                while (i+1>n1) and (j<=(2*n1-2-i)): 
                    array[i]+=list1[(i-n1)+j+1]*list2[n1-1-j]                                  
                    j+=1
                i+=1;j=0
            
            for i in range(len(array)):
                if array[i]==0:
                    continue
                else:
                    for j in range(len(array)-i):
                        list3.append(array[j+i])
                break
            return list3             


        else:
            for i in range(l):
                list1.insert(i,0)
            while i<=2*n2-2:        
                while (i+1<=n2) and (j<=i):
                    array[i]+=list2[j]*list1[i-j]
                    j+=1
                while (i+1>n2) and (j<=(2*n2-2-i)): 
                    array[i]+=list2[(i-n2)+j+1]*list1[n2-1-j]                                  
                    j+=1
                i+=1;j=0

            for i in range(len(array)):
                if array[i]==0:
                    continue
                else:
                    for j in range(len(array)-i):
                        list3.append(array[j+i])
                break
            return list3             

#n阶导数在x=19处的取值
list=[9,9,3,5]
a=polyf(3,list,19)
print(a)


#两个多项式列表的加法和减法
list1=[1,0,7]
list2=[19]
list3=polyring(list1,'+',list2)
print(list3)
list3=polyring(list1,'-',list2)
print(list3)

运行结果 

 【数学/多项式】用列表去实现一元多项式函数的四则运算,和它的n阶导数的Python算法实现_第1张图片

总结 

     这篇文章从心有所想到最终定稿总共花了近四天时间,其中也被诸多难点所困惑住,尤其是处理多项式的乘法,和它的n阶导数这两大难题,相信你们也看到了,从那几个循环里面的参数就可以知道,那么我是如何解决的呢?

     其实,主要还是得弄清楚一系列变量和所求数学结果(解)的关系,这里有一个很好的方法去找到这样的关系;众所周知,树形结合万般好,如果问题难以从量的形式入手,那么可以转换为从它的几何结构入手,从这种直观的,形象的几何结构入手,如果其中还存在着某种规律,我们还甚至还可以运用数学归纳法去得到我们想要的结果。(对于多项式的除法问题,这里并没有多少涉及,需要记住一点,如果不需要用到它的导数,则可以直接调用polyf()方法两个式子相除即可。)

     在接下来的几篇文章里,我可能会更新关于另外一些初等函数的算法实现,我同时还有另外一个想法,就是将这篇文章用英文阐述出来,这可是一个不小的工程,当然具体会怎么做,那还是未知的,到时候还是得以具体更新为准。

2022/11/11,浅晚。天无雨,略晴。

于渝·南山 

你可能感兴趣的:(数学/基本初等函数,python,算法)