yuange1975 发表于 2023-10-29 21:22:26

多项式极值极值方程式问题

多项式极值极值方程式问题

一些多项式极值因为极值点是高次方程,极值点解没有解析解或者解析解非常复杂,就导致计算极值非常困难,或者不容易化简。

其实我们可以把极值当成未知数,得到极值方程,就方便直接处理极值了。

之前用的待定系数法去解极值方程,高次求解比较慢,解这个方程也没什么好的算法,比较依靠软件。
最近做另外一个问题的时候,想到了其实极值表达式和极值点方程就是两个多项式,多项式可以用辗转相除法消元,然后就得到极值方程了。
辗转相除法算法非常简单,可以很快速的计算出来。所以把以前得到多项式极值方程的算法改写了一下。程序也处理了辗转相除时首系数包含未知数时系数为0的情况。

⚠️⚠️⚠️其实这个算法,不局限于求极值方程,可以求两个多项式有重根的情况,计算曲线相切情况的系数等等。
包括多元高次多项式方程组,最终都可以用这方法化成一个一元高次方程,然后求解。

测试用例测试了常见一些各种极值钓鱼贴的情况,效果非常好。
还给出一个案例,方程极值点是不可分解的四次方程,但是极值非常简单一个平方根。如果得到极值点去计算极值,化简非常困难,很难得到最终这么简单的极值表达式。


算法的Python代码实现:
#fxm.pyPolynomial Multiple Roots and Maxima Minima Problem copy by yuange 2023.10.22
from sympy import *
rn="\r\n"
x,m=symbols('x m',real=True)

def remfa(fm,fa):
    if fm==0 :
       return fm
    gcdm=gcd(fm,fa)
    fm=cancel(fm/gcdm)
    while (1):
      gcdm=gcd(fm,gcdm)
      fm=cancel(fm/gcdm)
      if gcdm==1:
         return fm
         
def sfm(gm,fm,nfm):
    gm=remfa(gm,nfm)
    fm1=gcd(gm,fm)
    return fm1,nfm

def snfm(gm,fm,nfm):
    nfm1=factor(cancel(gm*nfm/gcd(gm,nfm)))
    fm=remfa(fm,gm)
    return fm,nfm1

def fxzz(fma,fx,gx,fm,nfm):

    gx=collect(expand(gx),x)
    n=Poly(gx,x).degree()
    if n <=0:
       g1,g2=fraction(cancel(gx),m)
       fm1,nfm1=sfm(g1,fm,nfm)
       if Poly(g1,m).degree() !=0:
          fm1=fm1/factor_list(fm1)
          fm1=factor(fm1)
          f1,f2=fraction(cancel(fx),x)
          fx1=remfa(f1,nfm)
          fx1=fx1/factor_list(fx1)
          fx1=collect(fx1,x)
          n1=Poly(fm1,m).degree()
          if n1 !=0:
             flist={}
             flist['fm1']=fm1
             flist['fx1']=fx1
             flist['fx']=factor(f1)/factor(f2)
             flist['gx']=factor(g1)/factor(g2)
             flist['fm']=fm
             flist['nfm']=nfm
             fma.append(flist)

    else:

      xn=collect(gx,x).coeff(x,n)
      g1,g2=fraction(cancel(xn))

      fm1,nfm1=snfm(g1,fm,nfm)
      n1=Poly(fm1,m).degree()
      if n1!=0:
         hx=rem(fx,gx,x)
         fxzz(fma,gx,hx,fm1,nfm1)
      fm1,nfm1=sfm(g1,fm,nfm)
      n1=Poly(fm1,m).degree()
      if n1>=1:
         gx2=gx-xn*x**n
         fxzz(fma,fx,gx2,fm1,nfm1)
         
def fxm(fx):
    fx=cancel(fx)
    g1,g2=fraction(fx)
    print(rn,"fx=",fx)
    f=m*g2-g1

    g=diff(f,x)
    f=collect(expand(f),x)
    g=collect(expand(g),x)
    #print(rn,"f=",f)
    print(rn,"g=",factor(g))
    fma=[]
    fxzz(fma,f,g,0,1)
    print(rn,"fma=",fma)
    fm1=fma['fm1']
    print(rn,"fm1=",fm1)
    print(rn,solve(fm1,m))
    #print(rn,rn,solve(1.0*fm1,m))
   

def fxmtest():

    sinx=2*x/(1+x*x)
    cosx=(1-x*x)/(1+x*x)   
    f1=sinx+5/(1-cosx)
    f2=sinx*sinx+cosx
    f3=sinx*sinx*cosx+3*sinx-4*cosx
    t=x
    f4=4*(4*t**2+4*t+1)*(4*t**2+t+1)/(20*t**2+11*t+5)**2   
    f5=5*cosx+cosx/sinx
    f6=1/(sinx+2)+1/(cosx+3)
    f7=2/sinx+1/(cosx+1)
    f8=sinx*sinx*cosx+3*sinx-4*cosx   
    f9=sinx+1/cosx
    f=3125*x**5+9375*x**4+3125*x**3-7875*x*x-2525*x+1023
   
    fxm(f)
   
fxmtest()
页: [1]
查看完整版本: 多项式极值极值方程式问题