找回密码
 欢迎注册
查看: 1144|回复: 0

[原创] 多项式极值极值方程式问题

[复制链接]
发表于 2023-10-29 21:22:26 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

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

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

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

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

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

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


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

  5. def remfa(fm,fa):
  6.     if fm==0 :
  7.        return fm
  8.     gcdm=gcd(fm,fa)  
  9.     fm=cancel(fm/gcdm)
  10.     while (1):
  11.       gcdm=gcd(fm,gcdm)
  12.       fm=cancel(fm/gcdm)
  13.       if gcdm==1:
  14.          return fm
  15.          
  16. def sfm(gm,fm,nfm):
  17.     gm=remfa(gm,nfm)
  18.     fm1=gcd(gm,fm)
  19.     return fm1,nfm

  20. def snfm(gm,fm,nfm):
  21.     nfm1=factor(cancel(gm*nfm/gcd(gm,nfm)))
  22.     fm=remfa(fm,gm)
  23.     return fm,nfm1

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

  25.     gx=collect(expand(gx),x)
  26.     n=Poly(gx,x).degree()
  27.     if n <=0:
  28.        g1,g2=fraction(cancel(gx),m)
  29.        fm1,nfm1=sfm(g1,fm,nfm)
  30.        if Poly(g1,m).degree() !=0:
  31.           fm1=fm1/factor_list(fm1)[0]
  32.           fm1=factor(fm1)
  33.           f1,f2=fraction(cancel(fx),x)
  34.           fx1=remfa(f1,nfm)
  35.           fx1=fx1/factor_list(fx1)[0]
  36.           fx1=collect(fx1,x)
  37.           n1=Poly(fm1,m).degree()
  38.           if n1 !=0:
  39.              flist={}
  40.              flist['fm1']=fm1
  41.              flist['fx1']=fx1
  42.              flist['fx']=factor(f1)/factor(f2)
  43.              flist['gx']=factor(g1)/factor(g2)
  44.              flist['fm']=fm
  45.              flist['nfm']=nfm
  46.              fma.append(flist)

  47.     else:

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

  50.         fm1,nfm1=snfm(g1,fm,nfm)
  51.         n1=Poly(fm1,m).degree()
  52.         if n1!=0:
  53.            hx=rem(fx,gx,x)
  54.            fxzz(fma,gx,hx,fm1,nfm1)
  55.         fm1,nfm1=sfm(g1,fm,nfm)
  56.         n1=Poly(fm1,m).degree()
  57.         if n1>=1:
  58.            gx2=gx-xn*x**n
  59.            fxzz(fma,fx,gx2,fm1,nfm1)
  60.            
  61. def fxm(fx):
  62.     fx=cancel(fx)
  63.     g1,g2=fraction(fx)
  64.     print(rn,"fx=",fx)
  65.     f=m*g2-g1

  66.     g=diff(f,x)
  67.     f=collect(expand(f),x)
  68.     g=collect(expand(g),x)
  69.     #print(rn,"f=",f)
  70.     print(rn,"g=",factor(g))
  71.     fma=[]
  72.     fxzz(fma,f,g,0,1)
  73.     print(rn,"fma=",fma)
  74.     fm1=fma[0]['fm1']
  75.     print(rn,"fm1=",fm1)
  76.     print(rn,solve(fm1,m))
  77.     #print(rn,rn,solve(1.0*fm1,m))
  78.    

  79. def fxmtest():

  80.     sinx=2*x/(1+x*x)
  81.     cosx=(1-x*x)/(1+x*x)   
  82.     f1=sinx+5/(1-cosx)
  83.     f2=sinx*sinx+cosx
  84.     f3=sinx*sinx*cosx+3*sinx-4*cosx
  85.     t=x
  86.     f4=4*(4*t**2+4*t+1)*(4*t**2+t+1)/(20*t**2+11*t+5)**2   
  87.     f5=5*cosx+cosx/sinx
  88.     f6=1/(sinx+2)+1/(cosx+3)
  89.     f7=2/sinx+1/(cosx+1)
  90.     f8=sinx*sinx*cosx+3*sinx-4*cosx   
  91.     f9=sinx+1/cosx
  92.     f=3125*x**5+9375*x**4+3125*x**3-7875*x*x-2525*x+1023
  93.    
  94.     fxm(f)
  95.    
  96. fxmtest()
复制代码

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-21 20:41 , Processed in 0.023490 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表