
正文
包含python多项式函数的词条
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
python牛顿法求多项式的根
#includeiostream.h
#includemath.h
#includeconio.h
const int N=200;
//带入原函数后所得的值
double f(float x)
{
return (x*x*x-1.8*x*x+0.15*x+0.65);
}
//带入一阶导函数后所得的值
double f1(double x)
{
return (3*x*x-3.6*x+0.15);
}
//牛顿迭代函数
double F(double x)
{
double x1;
x1=x-1.0*f(x)/f1(x);
return (x1);
}
void main()
{
double x0,D_value,x1,y[4];
int k=0,count=0;
for(;;)
{
if(count==3)break;
cout"输入初始值:";
cinx0;
do
{
k++;
x1=F(x0);
D_value=fabs(x1-x0);
x0=x1;
}
while((D_value0.000005)(k=N));
for(int j=0,flag=0;jcount;j++)
{
if(fabs(y[j]-x1)0.000005)
{ flag=1;
cout"该数值附近的根已经求出python多项式函数,请重新换近似值"endl;
break;
}
}
if(flag==1)
continue;
else
{
cout"方程的一个根:"x1","" 迭代次数为:"kendl;
y[count]=x1;
count++;
}
//else
//cout"计算失败!"endl;
}
}
//python多项式函数你的程序其实没问题python多项式函数,牛顿迭代法本身循环一次只能找到一个答案,只要再建一个循环控制使
//用迭代法的次数和判断根的个数就行。我又加python多项式函数了一个判断是否有重复的根的循环。
//希望能对你有所帮助。
相关问答
Q1: 多项式拟合平方误差怎么求
线性模型(二)之多项式拟合
1. 多项式拟合问题
多项式拟合(polynominal curve fitting)是一种线性模型,模型和拟合参数的关系是线性的。多项式拟合的输入是一维的,即x=xx=x,这是多项式拟合和线性回归问题的主要区别之一。
多项式拟合的目标是构造输入xx的MM阶多项式函数,使得该多项式能够近似表示输入xx和输出yy的关系,虽然实际上xx和yy的关系并不一定是多项式,但使用足够多的阶数,总是可以逼近表示输入xx和输出yy的关系的。
多项式拟合问题的输入可以表示如下:
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
目标输出是得到一个多项式函数:
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
其中MM表示最高阶数为MM。
可见在线性拟合的模型中,共包括了(M+1)(M+1)个参数,而该模型虽然不是输入xx的线性函数,但却是(M+1)(M+1)个拟合参数的线性函数,所以称多项式拟合为线性模型。对于多项式拟合问题,其实就是要确定这(M+1)(M+1)个参数,这里先假设阶数MM是固定的(MM是一个超参数,可以用验证集来确定MM最优的值,详细的关于MM值确定的问题,后面再讨论),重点就在于如何求出这(M+1)(M+1)个参数的值。
2.优化目标
多项式拟合是利用多项式函数逼近输入xx和输出yy的函数关系,通过什么指标来衡量某个多项式函数的逼近程度呢?(其实这就是误差/损失函数)。拟合/回归问题常用的评价指标是均方误差(在机器学习中的模型评估与度量博客中,我进行了介绍)。多项式拟合问题也同样采用该评价指标,以均方误差作为误差/损失函数,误差函数越小,模型越好。
E(w,b)=1N∑i=1N[f(xi)−yi]2
E(w,b)=1N∑i=1N[f(xi)−yi]2
系数1N1N是一常数,对优化结果无影响,可以去除,即将均方误差替换为平方误差:
E(w,b)=∑i=1N[f(xi)−yi]2
E(w,b)=∑i=1N[f(xi)−yi]2
到这里,就成功把多项式拟合问题变成了最优化问题,优化问题可表示为:
argminw,bE(w,b)
argminw,bE(w,b)
即需要求得参数{w1,...,wM,b}{w1,...,wM,b}的值,使得E(w,b)E(w,b)最小化。那么如何对该最优化问题求解呢?
3. 优化问题求解
3.1 求偏导,联立方程求解
直观的想法是,直接对所有参数求偏导,令偏导为0,再联立这M+1M+1个方程求解(因为共有M+1M+1个参数,故求偏导后也是得到M+1M+1个方程)。
E(w,b)=∑i=1N[f(xi)−yi]2=∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]2
E(w,b)=∑i=1N[f(xi)−yi]2=∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]2
利用E(w,b)E(w,b)对各个参数求偏导,如下:
∂E(w,b)∂wj∂E(w,b)∂b=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]xji=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]
∂E(w,b)∂wj=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]xij∂E(w,b)∂b=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]
求导之后,将各个点(xi,yi)(xi,yi)的值带入偏导公式,联立方程求解即可。
针对该解法,可以举个例子详细说明,比如有两个点(2,3),(5,8)(2,3),(5,8),需要利用二阶多项式f(x)=w1x+w2x2+bf(x)=w1x+w2x2+b拟合。求解过程如下:
该二阶多项式对参数求偏导得到
∂E(w,b)∂wj∂E(w,b)∂b=2∑i=12[(w1x1i+w2x2i+b)−yi]xji=[(w1x1+w2x21+b)−y1]xj1+[(w1x2+w2x22+b)−y2]xj2=2∑i=12[(w1x1i+w2x2i+b)−yi]=[(w1x1+w2x21+b)−y1]+[(w1x2+w2x22+b)−y2]
∂E(w,b)∂wj=2∑i=12[(w1xi1+w2xi2+b)−yi]xij=[(w1x1+w2x12+b)−y1]x1j+[(w1x2+w2x22+b)−y2]x2j∂E(w,b)∂b=2∑i=12[(w1xi1+w2xi2+b)−yi]=[(w1x1+w2x12+b)−y1]+[(w1x2+w2x22+b)−y2]
将点(2,3),(5,8)(2,3),(5,8)带入方程,可以得到3个方程,
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
联立这三个方程求解,发现有无穷多的解,只能得到3w1+21w2=53w1+21w2=5,这三个方程是线性相关的,故没有唯一解。
该方法通过求偏导,再联立方程求解,比较复杂,看着也很不美观。那么有没有更加方便的方法呢?
3.2 最小二乘法
其实求解该最优化问题(平方和的最小值)一般会采用最小二乘法(其实最小二乘法和求偏导再联立方程求解的方法无本质区别,求偏导也是最小二乘法,只是这里介绍最小二乘的矩阵形式而已)。最小二乘法(least squares),从英文名非常容易想到,该方法就是求解平方和的最小值的方法。
可以将误差函数以矩阵的表示(NN个点,最高MM阶)为:
∥Xw−y∥2
‖Xw−y‖2
其中,把偏置bb融合到了参数ww中,
w={b,w1,w2,...,wM}
w={b,w1,w2,...,wM}
XX则表示输入矩阵,
⎡⎣⎢⎢⎢⎢11...1x1x2...xNx21x22...x2N............xM1xM2...xMN⎤⎦⎥⎥⎥⎥
[1x1x12...x1M1x2x22...x2M...............1xNxN2...xNM]
yy则表示标注向量,
y={y1,y2,...,yN}T
y={y1,y2,...,yN}T
因此,最优化问题可以重新表示为
minw∥Xw−y∥2
minw‖Xw−y‖2
对其求导,
∂∥Xw−y∥2∂w=∂(Xw−y)T(Xw−y)∂w=∂(wTXT−yT)(Xw−y)∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w
∂‖Xw−y‖2∂w=∂(Xw−y)T(Xw−y)∂w=∂(wTXT−yT)(Xw−y)∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w
在继续对其求导之前,需要先补充一些矩阵求导的先验知识(常见的一些矩阵求导公式可以参见转载的博客),如下:
∂xTa∂x=a∂ax∂x=aT∂xTA∂x=Ax+ATx
∂xTa∂x=a∂ax∂x=aT∂xTA∂x=Ax+ATx
根据上面的矩阵求导规则,继续进行损失函数的求导
∂∥Xw−y∥2∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w=XTXw+(XTX)Tw−(yTX)T−XTy=2XTXw−2XTy
∂‖Xw−y‖2∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w=XTXw+(XTX)Tw−(yTX)T−XTy=2XTXw−2XTy
其中XTXw=(XTX)TwXTXw=(XTX)Tw.令求导结果等于0,即可以求导问题的最小值。
2XTXw−2XTy=0w=(XTX)−1XTy
2XTXw−2XTy=0w=(XTX)−1XTy
再利用最小二乘法的矩阵形式对前面的例子进行求解,用二阶多项式拟合即两个点(2,3),(5,8)(2,3),(5,8)。
表示输入矩阵 XX和标签向量yy
X=[1125425]y=[38]T
X=[1241525]y=[38]T
计算XTXXTX
XTX=⎡⎣⎢272972913329133641⎤⎦⎥
XTX=[272972913329133641]
矩阵求逆,再做矩阵乘法运算
但 XTXXTX不可逆,故无唯一解。
关于矩阵的逆是否存在,可以通过判断矩阵的行列式是否为0(det(A)=?0det(A)=?0 来判断,也可以通过初等行变换,观察矩阵的行向量是否线性相关,在这个例子下,矩阵不可逆,故有无穷多解。但如果新增一个点(4,7)(4,7),则就可以解了。
其实这和数据集的点数和选择的阶数有关,如果点数小于阶数则会出现无穷解的情况,如果点数等于阶数,那么刚好有解可以完全拟合所有数据点,如果点数大于阶数,则会求的近似解。
那么对于点数小于阶数的情况,如何求解?在python的多项式拟合函数中是可以拟合的,而且效果不错,具体算法不是很了解,可以想办法参考python的ployfit()函数的实现。
4. 拟合阶数的选择
在前面的推导中,多项式的阶数被固定了,那么实际场景下应该如何选择合适的阶数MM呢?
一般会选择阶数MM小于点数NN
把训练数据分为训练集合验证集,在训练集上,同时用不同的MM值训练多个模型,然后选择在验证集误差最小的阶数script type="math/tex" id="MathJax-Element-5573"M/script
Q2: python 编程,求多项式的根
t,a,r=0,1,0
while a=100:
空if t==0:
空空r,t=r+a,1
空else:
空空r,t=r-a,0
空a+=2
print r
以f(x)=3x^2-e^x为例,以下为C++代码:
#includeiostream
{
double x;
cout"输入du初始迭代zhi值:"endl;
cinx;
while(abs(f(x))0.00001) x=x-f(x)/fd(x);
cout"计算结果: x="x", f(x)="f(x)endl;
system("pause");
return 0;
运行结果:输入0.9,输出daox=0.910008, f(x)=6.36005e-009
扩展资料:
根据PEP的规定,必须使用4个空格来表示每级缩进(不清楚4个空格的规定如何,在实际编写中可以自定义空格数,但是要满足每级缩进间空格数相等)。使用Tab字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。支持Tab字符和其它数目的空格仅仅是为兼容很旧的的Python程序和某些有问题的编辑程序。
参考资料来源:百度百科-Python
Q3: Python 中的函数拟合
很多业务场景中,我们希望通过一个特定的函数来拟合业务数据,以此来预测未来数据的变化趋势。(比如用户的留存变化、付费变化等)
本文主要介绍在 Python 中常用的两种曲线拟合方法:多项式拟合 和 自定义函数拟合。
通过多项式拟合,我们只需要指定想要拟合的多项式的最高项次是多少即可。
运行结果:
对于自定义函数拟合,不仅可以用于直线、二次曲线、三次曲线的拟合,它可以适用于任意形式的曲线的拟合,只要定义好合适的曲线方程即可。
运行结果:
Q4: python实现两个多项式相乘
可以用数组存放多项式系数,数组长度是次数十1,根据乘法规则,求解积的各系数,并存储。结果数组的长度是两多项式次数和十1。
Q5: 急求 python 使用class定义多项式P(x)=a0=a1x+a2x^2……anx^n 使用__init__()产生一个列表记录a的值
pip install future
from __future__ import division, unicode_literals, print_function
from future.utils import python_2_unicode_compatible
import re
@python_2_unicode_compatible
class P(object):
def __init__(self,a):
self.a=a
def __add__(self,p):
a,b=self.a, p.a
if len(self.a)len(p.a):
a,b=b,a
for i in range(len(b)):
a[i]+=b[i]
return P(a)
def der(self):
a=[]
for i,j in enumerate(self.a,1):
a.append(i*j)
return self._getStr('dP(x)/dx = ',a)
def ind(self):
a=[]
for i,j in enumerate(self.a,1):
a.append(i/j)
return self._getStr('P(x)dx = ',['c']+a)
def _getStr(self,prefix='P(x) = ',a=None):
if not a:
a=self.a
s=''
for i,j in enumerate(a):
if j:
if 0==i:
s=j
else:
if not s:
s='{}x^{}'.format(j,i)
else:
s='{} + {}x^{}'.format(s,j,i)
if not s:
s='0'
s=re.sub(r'x\^1 ','x ',s)
s=re.sub(r'^1x| 1x',' x',s)
return '{}{}'.format(prefix,s)
def __str__(self):
return self._getStr()
def main():
p1=P([1,2,3])
p2=P([0,1,0,1,6,77,8])
print('p1:',p1)
print('p2:',p2)
print('p1+p2:',p1+p2)
print('derivative of p1:',p1.der())
print('indefinite of p2:',p2.ind())
if __name__=='__main__':
main()
python多项式函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、python多项式函数的信息别忘了在本站进行查找喔。






