#includeiostream.h
員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團(tuán)隊(duì)的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。成都創(chuàng)新互聯(lián)公司堅(jiān)持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩W⑺詫I(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、電商網(wǎng)站開發(fā),微信小程序定制開發(fā),軟件定制網(wǎng)站開發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。
#includemath.h
#includeconio.h
const int N=200;
//帶入原函數(shù)后所得的值
double f(float x)
{
return (x*x*x-1.8*x*x+0.15*x+0.65);
}
//帶入一階導(dǎo)函數(shù)后所得的值
double f1(double x)
{
return (3*x*x-3.6*x+0.15);
}
//牛頓迭代函數(shù)
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"該數(shù)值附近的根已經(jīng)求出,請(qǐng)重新?lián)Q近似值"endl;
break;
}
}
if(flag==1)
continue;
else
{
cout"方程的一個(gè)根:"x1","" 迭代次數(shù)為:"kendl;
y[count]=x1;
count++;
}
//else
//cout"計(jì)算失敗!"endl;
}
}
//你的程序其實(shí)沒問題,牛頓迭代法本身循環(huán)一次只能找到一個(gè)答案,只要再建一個(gè)循環(huán)控制使
//用迭代法的次數(shù)和判斷根的個(gè)數(shù)就行。我又加了一個(gè)判斷是否有重復(fù)的根的循環(huán)。
//希望能對(duì)你有所幫助。
拉格朗日插值Python代碼實(shí)現(xiàn)
1. 數(shù)學(xué)原理
對(duì)某個(gè)多項(xiàng)式函數(shù)有已知的k+1個(gè)點(diǎn),假設(shè)任意兩個(gè)不同的都互不相同,那么應(yīng)用拉格朗日插值公式所得到的拉格朗日插值多項(xiàng)式為:
其中每個(gè)lj(x)為拉格朗日基本多項(xiàng)式(或稱插值基函數(shù)),其表達(dá)式為:
2. 輕量級(jí)實(shí)現(xiàn)
利用
直接編寫程序,可以直接插值,并且得到對(duì)應(yīng)的函數(shù)值。但是不能得到系數(shù),也不能對(duì)其進(jìn)行各項(xiàng)運(yùn)算。
123456789101112
def?h(x,y,a):????ans=0.0????for?i?in?range(len(y)):????????t=y[i]????????for?j?in?range(len(y)):????????????if?i !=j:????????????????t*=(a-x[j])/(x[i]-x[j])????????ans?+=t????return?ansx=[1,0]y=[0,2]print(h(x,y,2))
上述代碼中,h(x,y,a)就是插值函數(shù),直接調(diào)用就行。參數(shù)說明如下:
x,y分別是對(duì)應(yīng)點(diǎn)的x值和y值。具體詳解下解釋。
a為想要取得的函數(shù)的值。
事實(shí)上,最簡單的拉格朗日插值就是兩點(diǎn)式得到的一條直線。
例如:
p點(diǎn)(1,0)q點(diǎn)(0,2)
這兩個(gè)點(diǎn)決定了一條直線,所以當(dāng)x=2的時(shí)候,y應(yīng)該是-2
該代碼就是利用這兩個(gè)點(diǎn)插值,然后a作為x=2調(diào)用函數(shù)驗(yàn)證的。
3. 引用庫
3.1 庫的安裝
主要依賴與 scipy。官方網(wǎng)站見:
安裝的方法很簡單,就是使用pip install scipy 如果失敗,則將whl文件下載到本地再利用命令進(jìn)行安裝。
可能如果沒有安裝numpy
3.2 庫的使用
from scipy.interplotate import lagrange
直接調(diào)用lagrange(x,y)這個(gè)函數(shù)即可,返回 一個(gè)對(duì)象。
參數(shù)x,y分別是對(duì)應(yīng)各個(gè)點(diǎn)的x值和y值。
例如:(1,2) (3,5) (5,9)這三個(gè)點(diǎn),作為函數(shù)輸入應(yīng)該這么寫:
x=[1,3,5]
y =[2, 5, 9]
a=lagrange(x,y)
直接輸出該對(duì)象,就能看到插值的函數(shù)。
利用該對(duì)象,能得到很多特性。具體參見:
a.order得到階
a[]得到系數(shù)
a()得到對(duì)應(yīng)函數(shù)值
此外可以對(duì)其進(jìn)行加減乘除運(yùn)算
3.3 代碼實(shí)現(xiàn)
1234567? ?from?scipy.interpolate?import?lagrangex=[1,2,3,4,7]y=[5,7,10,3,9]a=lagrange(x,y)print(a)print(a(1),a(2),a(3))print(a[0],a[2],a[3])? ?
結(jié)果是:
class 'numpy.lib.polynomial.poly1d' 4
4 ? ? ? ? ? ?3 ? ? ? ? ? ? ?2
0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13
5.0 7.0 10.0
28.1333333333 30.6527777778 -7.30555555556
解釋:
class 'numpy.lib.polynomial.poly1d' 4
這一行是輸出a的類型,以及最高次冪。
4 ? ? ? ? ? ?3 ? ? ? ? ? ? ?2
0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13
第二行和第三行就是插值的結(jié)果,顯示出的函數(shù)。
第二行的數(shù)字是對(duì)應(yīng)下午的x的冪,如果對(duì)應(yīng)不齊,則是排版問題。
5.0 7.0 10.0
第四行是代入的x值,得到的結(jié)果。
也就是說,用小括號(hào)f(x)的這種形式,可以直接得到計(jì)算結(jié)果。
28.1333333333 30.6527777778 -7.30555555556
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"計(jì)算結(jié)果: x="x", f(x)="f(x)endl;
system("pause");
return 0;
運(yùn)行結(jié)果:輸入0.9,輸出daox=0.910008, f(x)=6.36005e-009
擴(kuò)展資料:
根據(jù)PEP的規(guī)定,必須使用4個(gè)空格來表示每級(jí)縮進(jìn)(不清楚4個(gè)空格的規(guī)定如何,在實(shí)際編寫中可以自定義空格數(shù),但是要滿足每級(jí)縮進(jìn)間空格數(shù)相等)。使用Tab字符和其它數(shù)目的空格雖然都可以編譯通過,但不符合編碼規(guī)范。支持Tab字符和其它數(shù)目的空格僅僅是為兼容很舊的的Python程序和某些有問題的編輯程序。
參考資料來源:百度百科-Python
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()
he?=?0
for?n?in?range(0,100):
if?(n?%?2?==?0):
he?+=?2?*?n?+1
else:
he?-=?2?*?n?+?1
print(he)
代碼這樣就差不多了