多项式极值极值方程式问题
多项式极值极值方程式问题一些多项式极值因为极值点是高次方程,极值点解没有解析解或者解析解非常复杂,就导致计算极值非常困难,或者不容易化简。
其实我们可以把极值当成未知数,得到极值方程,就方便直接处理极值了。
之前用的待定系数法去解极值方程,高次求解比较慢,解这个方程也没什么好的算法,比较依靠软件。
最近做另外一个问题的时候,想到了其实极值表达式和极值点方程就是两个多项式,多项式可以用辗转相除法消元,然后就得到极值方程了。
辗转相除法算法非常简单,可以很快速的计算出来。所以把以前得到多项式极值方程的算法改写了一下。程序也处理了辗转相除时首系数包含未知数时系数为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]