What is taylor formula?
泰勒中值定理:若函數f(x)在含有x0的某個開區間內具有直到(n+1)階的導數,那麼對於任一x∈(a,b),有:
ζ為x0與x之間的某個值,f(x)稱為n階泰勒公式,其中:
稱為n次泰勒多項式,它與f(x)的誤差:
稱為泰勒餘項。
通俗地講解,泰勒公式也稱泰勒展開式。是用一個函數在某點的信息,描述其附近取值的公式。如果函數足夠平滑,在已知函數在某一點的各階導數值的情況下,泰勒公式可以利用這些導數值來做係數,構建一個多項式近似函數,求得在這一點的鄰域中的值。
泰勒公式的實際應用就是用一個多項式函數去逼近一個給定的函數(即儘量使多項式函數圖像擬合給定的函數圖像),注意,逼近的時候一定是從函數圖像上的某個點展開。如果一個非常複雜函數,想求其某點的值,直接求無法實現,這時候可以使用泰勒公式去近似的求該值,這是泰勒公式的應用之一。泰勒公式在機器學習中主要應用於梯度迭代。
過冷水在學習過程中曾經出現過一個誤解,「認為多項式擬合思想是基於泰勒公式」this is error!
多項式擬合是用一個多項式展開去擬合包含數個分析格點的一小塊分析區域中的所有觀測點,得到觀測數據的客觀分析場。展開係數用最小二乘擬合確定。
泰勒公式多項式係數由逼近點導數確定,泰勒公式是從某一點展開,即時假設該點是原點也不可以認為是多項式擬合。擬合&和逼近,喜歡摳字眼的人能夠給你講的很清楚。
多項式一般是用於擬合一些列點儘可能的讓點落在多項表示的函數上,泰勒公式是用多項式表示一個函數式,可用於求解數值積分。過冷水之前的一篇推文就把這個概念給弄混了。
現在給實際演示一下,用兩種不同方法表示下例函數:
計算結果:
原始碼:
syms xf1=((x.^4.*exp(x))./(exp(x)-1).^2);%泰勒公式在0點展開f2=taylor(f1,x,'ExpansionPoint',0,'Order',7);%在五點展開f3=taylor(f1,x,'ExpansionPoint',5,'Order',7);%泰勒公式在8點展開f4=taylor(f1,x,'ExpansionPoint',8,'Order',7);%多項式擬合x=linspace(0.1,10,100);y1=(x.^4.*exp(x))./(exp(x)-1).^2;p=polyfit(x,y1,6);f5= p(1)*x.^6 + p(2)*x.^5 + p(3)*x.^4+ p(4)*x.^3 + p(5).*x.^2 + p(6).*x+p(7);figure1 = figure;% 創建 subplot1subplot1 = subplot(2,3,1,'Parent',figure1);hold(subplot1,'on');h1=ezplot(f1,[0,10]);set(h1,'Color','r','LineWidth',2);text('Parent',subplot1,'FontSize',12,'Interpreter','latex','String',' $f_1=\frac{{x}^{4} {exp}({x})}{({exp}({x}) - {1})^{2}}$','Position',[2.04663212435233 0.642142934709296 0]);xlabel('{x}');title('原函數');xlim(subplot1,[0 10]);ylim(subplot1,[-0.503063977246079 5.39061349763272]);box(subplot1,'on');set(subplot1,'LineWidth',1.5);% 創建 subplot2subplot2 = subplot(2,3,2,'Parent',figure1);hold(subplot2,'on');h2=ezplot(f2,[0,10]);set(h2,'Color','b','LineWidth',2);xlabel('$$f_2=f(0)+f^{1}(0)x+...\frac{f^{7}(0)x^7}{7!}$$','Interpreter','latex');title('泰勒公式x_0=0,七次展開');text(5,2,' 2');xlim(subplot2,[0 10]);ylim(subplot2,[-174.382571609797 2791.21109645392]);box(subplot2,'on');set(subplot2,'LineWidth',1.5,'ZGrid','on');% 創建 subplot3subplot3 = subplot(2,3,3,'Parent',figure1);hold(subplot3,'on');h3=ezplot(f3,[0,10]);set(h3,'Color','g','LineWidth',2);xlabel('$$f_3=f(5)+f^{1}(5){(x-5)}+...\frac{f^{7}(5){(x-5)^7}}{7!}$$','Interpreter','latex');title('泰勒公式x_0=5,7次展開');text(5,2,' 1');xlim(subplot3,[0 10]);ylim(subplot3,[0.921374829561043 5.28031508945495]);box(subplot3,'on');set(subplot3,'LineWidth',1.5);% 創建 subplot4subplot4 = subplot(2,3,4,'Parent',figure1);hold(subplot4,'on');h4=ezplot(f4,[0,10]);set(h4,'Color','c','LineWidth',2);xlabel('$$f_4=f(8)+f^{1}(8){(x-8)}+...\frac{f^{7}(8){(x-8)^7}}{7!}$$','Interpreter','latex');title('泰勒公式x_0=8七次展開');
xlim(subplot4,[0 10]);ylim(subplot4,[-26.6703291235615 6.65080265872201]);box(subplot4,'on');set(subplot4,'LineWidth',1.5);% 創建 subplot5subplot5 = subplot(2,3,5,'Parent',figure1);hold(subplot5,'on');plot(x,f5,'Parent',subplot5,'LineWidth',2,'Color',[0 0 0]);text('Parent',subplot5,'Interpreter','latex','String','$$f5=p_1x^6+....p_6x^1+p_7$$','Position',[1.58031088082902 0.571428571428571 0]);title('多項式六次擬合');text(5,2,'5');box(subplot5,'on');set(subplot5,'LineWidth',1.5);% 創建 subplot6subplot6 = subplot(2,3,6,'Parent',figure1);hold(subplot6,'on');plot(x,f5,'Parent',subplot6,'LineWidth',2,'Color',[0 0 0]);h3=ezplot(f3,[0,10])set(h3,'Color','g','LineWidth',2)h1=ezplot(f1,[0,10])set(h1,'Color','r','LineWidth',2)xlabel('{x}');title('多項式、泰勒公式比較');xlim(subplot6,[0 10]);ylim(subplot6,[0.921374829561043 5.28031508945495]);box(subplot6,'on');set(subplot6,'LineWidth',1.5);計算可知多項式能夠很好的替換原函數,泰勒公式在三個點處,用七次展開都不能很好的吻合原函數,是不是泰勒公式不好啊?我做的判斷能夠表示實際結果嗎?我又做了如下工作:
原始碼:
syms xf1=(x.^4.*exp(x))./(exp(x)-1).^2;%泰勒公式在0點展開f2=taylor(f1,x,'ExpansionPoint',0,'Order',7);%泰勒公式在5點展開f3=taylor(f1,x,'ExpansionPoint',5,'Order',10);%多項式擬合x=linspace(-50,50,500);y1=(x.^4.*exp(x))./(exp(x)-1).^2;p=polyfit(x,y1,10);f4=p(1)*x.^10+p(2)*x.^9+p(3)*x.^8 + p(4)*x.^7 + p(5)*x.^6+ p(6)*x.^5 + p(7).*x.^4 +p(8)*x.^3+p(9)*x.^2+p(10)*x.^1 + p(11);figure1 = figure;axes1 = axes('Parent',figure1);hold(axes1,'on');h1=ezplot(f1,[-50,50]);set(h1,'Color','r','LineWidth',2,'DisplayName','$$f_1=\frac{{x}^{4} {exp}({x})}{({exp}({x}) - {1})^{2}}$$');h2=ezplot(f2,[-50,50]);set(h2,'Color','b','LineWidth',2,'DisplayName','$$f_2=f(0)+f^{1}(0)x+...\frac{f^{7}(0)x^7}{7!}$$');h3=ezplot(f3,[-50,50]);set(h3,'Color','g','LineWidth',2,'DisplayName','$$f_3=f(5)+f^{1}(5){(x-5)}+...\frac{f^{10}(5){(x-5)^10}}{10!}$$');% 創建 plotplot(x,f4,'DisplayName','$$f_4=p_1x^{10}+....p_{10}x^1+p_{11}$$','LineWidth',2,'Color',[0 0 0]);xlabel('{x}');title('多項式擬合和泰勒級數展開比較');xlim(axes1,[-50 50]);ylim(axes1,[-1 6]);box(axes1,'on');set(axes1,'FontSize',14,'LineWidth',2);legend1 = legend(axes1,'show');set(legend1,'Position',[0.637438496065231 0.676591289840403 0.223608969388694 0.190075376826265],'Interpreter','latex','FontSize',10,'EdgeColor',[1 1 1]);由圖可知:
當擴大函數區間,多項式擬合就不太適用於該函數。說明了多項式擬合的局限性。
泰勒展開式式在某一點附近展開,局部符合程度比較好,隨著遠離展開點,符合情況較差。
兩種方法各優缺點。不能一有問題就想到多項式擬合,多項式擬合是不能代替原函數或者某種變化趨勢的。泰勒公式也只是能夠描述簡單函數,對於複雜的函數就也不能做到替換原函數,不知道詳情的我之前一直以為泰勒公式是可以做到任意替換的,至少理論上是,實際是理論上都不是,這裡需要注意的是不同點展開的函數是不一樣的。
過冷水本打算用另一種基數展開式來藐視泰勒級數展開式的局限性的,奈何案例函數太複雜,求不出不出來展開式係數。所以上述案例就沒放。
傅立葉變化大家聽得很多,但提到傅立葉級數就不一定了解了,為什麼大家一致搞不懂傅立葉變化是什麼?因為沒搞懂什麼是傅立葉級數。過冷水現在就帶你弄明白什麼是傅立葉級數。
傅立葉級數是一種特殊形式的函數展開。一個函數按泰勒展開時,基底函數取1、x2、x3而傅立葉級數展開時基底函數取1,cosx、sinx,cos2x、sin2xcosnx、sinnx,傅立葉級數一般情況下表示為:
我們看一個實戰案例:
原始碼:
syms xf1=x*(x-pi)*(x-2*pi);f2=taylor(f1,x,'ExpansionPoint',0,'Order',7);[an,bn,f]=fseries(fx,x,12,0,2*pi);%前12項展開f3=latex(f);%將f轉換成latex代碼figure1 = figure;axes1 = axes('Parent',figure1);hold(axes1,'on');h1=ezplot(f1,[0,2*pi]);set(h1,'LineWidth',4,'LineStyle',':','Color',[1 0 0],'DisplayName','$$f_1=\frac{{x}^{4} {exp}({x})}{({exp}({x}) - {1})^{2}}$$');h2=ezplot(f2,[0,2*pi]);set(h2,'LineWidth',3, 'Color',[0 0 1],'DisplayName','$$f_2=f(0)+f^{1}(0)x+...\frac{f^{7}(0)x^7}{7!}$$');h3=ezplot(f,[0,2*pi]);set(h3,'LineWidth',1,'Color',[0.929411768913269 0.694117665290833 0.125490203499794],'DisplayName','$$f_3=a_0+\sum_{n=1}^{12}{(a_ncosx+b_nsinnx)}$$');xlabel('{x}');title('傅立葉級數和泰勒級數展開比較');xlim(axes1,[-2 8]);ylim(axes1,[-10 14]);box(axes1,'on');set(axes1,'FontSize',14,'LineWidth',2);legend1 = legend(axes1,'show');set(legend1,'Interpreter','latex');傅立葉級數函數
function [an,bn,f]=fseries(fx,x,n,a,b)%傅立葉級數展開%an為fourier餘弦項係數%bn為fourier正弦項係數%f為展開表達式if nargin==3 a=-pi; b=pi;endl=(b-a)/2;if a+b fx=subs(fx,x,x+l+a);endan=int(fx,x,-l,l)/l;bn=[];f=an/2;for ii=1:n ann=int(fx*cos(ii*pi*x/l),x,-l,l)/l; bnn=int(fx*sin(ii*pi*x/l),x,-l,l)/l; an=[an,ann]; bn=[bn,bnn]; f=f+ann*cos(ii*pi*x/l)+bnn*sin(ii*pi*x/l);endif a+b f=subs(f,x,x-l-a);end用兩種不同的級數表示原函數表示,結果較好。說明傅立葉級數表達式有表示其它函數的功能,本期推文過冷水通過複習泰勒級數讓大家知道級數和多項式的區別,以及級數替代函數的形式的級數類型不是唯一的。
由於傅立葉級數這一部分內容比較多,學習起來較難,故會在下期給大家詳講。
往期回顧>>>>>>你所不知道的Monte Carlo形式
數值計算——MATLAB數值積分原理詳講