- 注册时间
- 2016-5-4
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 217
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
多项式极值极值方程式问题
一些多项式极值因为极值点是高次方程,极值点解没有解析解或者解析解非常复杂,就导致计算极值非常困难,或者不容易化简。
其实我们可以把极值当成未知数,得到极值方程,就方便直接处理极值了。
之前用的待定系数法去解极值方程,高次求解比较慢,解这个方程也没什么好的算法,比较依靠软件。
最近做另外一个问题的时候,想到了其实极值表达式和极值点方程就是两个多项式,多项式可以用辗转相除法消元,然后就得到极值方程了。
辗转相除法算法非常简单,可以很快速的计算出来。所以把以前得到多项式极值方程的算法改写了一下。程序也处理了辗转相除时首系数包含未知数时系数为0的情况。
⚠️⚠️⚠️其实这个算法,不局限于求极值方程,可以求两个多项式有重根的情况,计算曲线相切情况的系数等等。
包括多元高次多项式方程组,最终都可以用这方法化成一个一元高次方程,然后求解。
测试用例测试了常见一些各种极值钓鱼贴的情况,效果非常好。
还给出一个案例,方程极值点是不可分解的四次方程,但是极值非常简单一个平方根。如果得到极值点去计算极值,化简非常困难,很难得到最终这么简单的极值表达式。
算法的Python代码实现:
- #fxm.py Polynomial 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)[0]
- fm1=factor(fm1)
- f1,f2=fraction(cancel(fx),x)
- fx1=remfa(f1,nfm)
- fx1=fx1/factor_list(fx1)[0]
- 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[0]['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()
复制代码
|
|