درون یابی چند جمله ای — به زبان ساده

۳۱۱۳ بازدید
آخرین به‌روزرسانی: ۱۳ اردیبهشت ۱۴۰۲
زمان مطالعه: ۱۱ دقیقه
درون یابی چند جمله ای — به زبان ساده

گاهی لازم است مقدار تابع y=f(x) y = f ( x ) را در یک نقطه معین x x ، بر اساس مقادیر معلوم f(x0) f ( x _ 0 )، ... و f(xn) f ( x _ n ) در مجموعه n+1 n + 1 نقطه a=x0x1xn=b a = x _ 0 \le x _ 1 \le \cdots \le x _ n = b در بازه [a,b] [a , b ] تخمین بزنیم. اگر a<x<b a < x < b باشد، این فرایند «درون‌یابی» (Interpolation) نامیده می‌شود و اگر x<a x < a یا x>b x > b باشد، به آن «برون‌یابی» (Extrapolation) می‌گوییم. در این آموزش، با «درون یابی چند جمله ای» (Polynomial Interpolation) آشنا می‌شویم.

997696

درون یابی چند جمله ای

یکی از راه‌های انجام درون‌یابی و برون‌یابی، تقریب تابع f(x) f ( x ) با یک چندجمله‌ای مرتبه nnاُم است:

f(x)Pn(x)=anxn+an1xn1++a2x2+a1x+a0=j=0najxj \large \begin {equation} f ( x ) \approx P _ n ( x ) = a _ n x ^ n + a _ { n - 1 } x ^ { n - 1 } + \cdots + a _ 2 x ^ 2 + a _ 1 x + a _ 0 = \sum _ { j = 0 } ^ n a _ j x ^ j \end {equation}

که در آن، n+1 n + 1 ضریب a0 a _ 0، ... و an a _ n را می‌توان با n+1 n + 1 نقطه داده شده به دست آورد. وقتی Pn(x) P _ n ( x ) را به دست آوریم، می‌توانیم هر عملیاتی (مانند مشتق‌گیری، انتگرال‌گیری، یا یافتن ریشه) را که می‌خواهیم روی تابع f(x) f ( x ) انجام دهیم، آن را به صورت تقریب به Pn(x)f(x) P _ n ( x ) \approx f ( x ) اعمال کنیم. این کار، به ویژه در مواقعی که تابع f(x) f ( x ) یک تابع غیرمقدماتی بوده و در نتیجه، کار با آن دشوار باشد، یا فرم بسته‌ای نداشته باشد، بسیار کارساز خواهد بود.

به طور مشخص، برای یافتن ضرایب Pn(x) P _ n ( x )، لازم است همه نقاط {xi,yi=f(xi),  i=0,,n} \{ x _ i , y _ i = f ( x _ i ) , \; i = 0 , \cdots , n \} ، یعنی n+1 n + 1 معادله خطی زیر را داشته باشیم:

Pn(xi)=j=0najxij=f(xi)=yi,        (i=0,,n) \large \begin {equation} P _ n ( x _ i ) = \sum _ { j = 0 } ^ n a _ j x ^ j_ i = f ( x _ i ) = y _ i , \; \; \; \; ( i = 0 , \cdots , n ) \end {equation}

اکنون می‌توان ضرایب a0 a _ 0 ، ... و an a _ n را با حل این n+1 n + 1 معادله خطی به دست آورد. این معادلات را می‌توان به فرمی ماتریسی زیر نوشت:

[1x0x02x0n1x1x12x1n1x2x22x2n1xnxn2xnn][a0a1a2an]=Va=[y0y1y2yn]=y \large \begin {equation} \left [ \begin {array} {ccccc} 1 & x _ 0 & x _ 0 ^ 2 & \cdots & x _ 0 ^ n \\ 1 & x _ 1 & x _ 1 ^ 2 & \cdots & x _ 1 ^ n \\ 1 & x _ 2 & x _ 2 ^ 2 & \cdots & x _ 2 ^ n \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x _ n & x _ n ^ 2 & \cdots & x _ n ^ n \end {array} \right ] \left [ \begin {array} { c } a _ 0 \\ a _ 1 \\ a _ 2 \\ \vdots \\ a _ n \end {array} \right] = { \bf V } { \bf a } = \left [ \begin {array} { c } y _ 0 \\ y _ 1 \\ y _ 2 \\ \vdots \\ y _ n \end {array} \right] = { \bf y } \end {equation}

که در آن، a=[a0,,an]T {\bf a}=[a_0,\cdots,a_n]^T و y=[y0,,yn]T {\bf y}=[y_0,\cdots,y_n]^T و

V=[1x0x02x0n1x1x12x1n1x2x22x2n1xnxn2xnn] \large \begin {equation} { \bf V } = \left [ \begin {array} {ccccc} 1 & x _ 0 & x _ 0 ^ 2 & \cdots & x _ 0 ^ n \\ 1 & x _ 1 & x _ 1 ^ 2 & \cdots & x _ 1 ^ n \\ 1 & x _ 2 & x _ 2 ^ 2 & \cdots & x _ 2 ^ n \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x _ n & x _ n ^ 2 & \cdots & x _ n ^ n \end {array} \right ] \end {equation}

ماتریس V\mathbf {V} به عنوان «ماتریس وندرموند» (Vandermonde Matrix) شناخته می‌شود. با حل این دستگاه، ضرایب [a0,,an]T=a=V1y [a_0,\cdots,a_n]^T={\bf a}={\bf V}^{-1}{\bf y} به دست می‌آیند. در اینجا، n+1 n +1 چندجمله‌ای x0 x ^ 0 ، x1 x ^ 1، x2 x ^ 2 ، ... و xn x ^ n را می‌توان به عنوان مجموعه‌ای از توابع پایه چندجمله‌ای در نظر گرفت که فضای همه چندجمله‌ای‌های درجه n nاُم را اسپن می‌کنند. اگر نقاط x0 x _ 0 ، ... و xn x _ n متمایز باشند، یعنی V \mathbf { V} دارای رتبه کامل بوده و معکوس آن، V1 \mathbf { V} ^ { - 1 } ، وجود داشته باشد، آنگاه جواب سیستم a=V1f \mathbf {a } = \mathbf { V} ^ {-1} \mathbf { f} و در نتیجه Pn(x) P _ n ( x ) یکتا است.

البته در عمل این روش به دو دلیل استفاده نمی‌شود: اول اینکه پیچیدگی محاسباتی O(n3) O ( n ^ 3 ) برای محاسبه معکوس V \mathbf { V} زیاد است و دوم اینکه با افزایش n n ماتریس V \mathbf { V} بدحالت‌تر می‌شود. بنابراین روش‌های دیگری نیز برای درون‌یابی پیشنهاد شده‌اند.

خطای درون یابی چند جمله ای این‌گونه تعریف می‌شود:

Rn(x)=f(x)Pn(x) \large R _ n ( x ) = f ( x ) - P _ n ( x )

که در حالت کلی غیرصفر است، البته جز در نقطه x=xi x = x _ i که Rn(xi)=0,  (i=0,,n) R_n(x_i)=0,\;(i=0,\cdots,n) است. به عبارت دیگر، تابع خطای Rn(x) R_ n ( x ) دارای n+1 n + 1 ریشه در x0 x _ 0 ، ... و xn x _ n است و در نتیجه، می‌توان آن را به صورت زیر نوشت:

Rn(x)=u(x)i=0n(xxi)=u(x)ω(x) \large R _ n ( x ) = u ( x ) \prod _ { i = 0 } ^ n ( x - x _ i ) =u ( x ) \omega ( x )

که در آن، u(x) u ( x ) یک تابع مجهول و ω(x) \omega ( x ) یک چندجمله‌ای درجه n+1 n + 1 است که به صورت زیر تعریف می‌شود:

ω(x)=i=0n(xxi) \large \omega ( x ) = \prod _ { i = 0 } ^ n ( x - x _ i )

برای یافتن u(x) u ( x ) ، تابع دیگری به نام F(t) F ( t ) از متغیر t t را تشکیل می‌دهیم که در آن، هر x(a,b) x \in ( a , b ) به عنوان یک پارامتر در نظر گرفته می‌شود:

F(t)=Rn(t)u(x)i=0n(txi)=f(t)Pn(t)u(x)i=0n(txi) \large F ( t ) = R _ n ( t ) - u ( x ) \prod _ { i = 0 } ^ n ( t - x _ i ) = f ( t ) - P _ n ( t ) - u ( x ) \prod _ { i = 0 } ^ n ( t - x _ i )

که در t=x t = x برابر با صفر است:

F(x)=Rn(x)u(x)i=0n(xxi)=Rn(x)Rn(x)=0 \large F ( x ) = R _ n ( x ) - u ( x ) \prod _ { i = 0 } ^ n ( x - x _ i ) = R _ n ( x ) - R _ n ( x ) = 0

بنابراین، می‌توان گفت که F(t) F ( t ) دارای n+2 n + 2 ریشه در x0 x _ 0 ، ... و xn x _ n و x x است. قضیه رول بیان می‌کند که تابع مشتق f(x) f' ( x ) هر تابع مشتق‌پذیر f(x) f ( x ) که در رابطه f(a)=f(b)=0 f ( a ) = f ( b ) = 0 صدق می‌کند، باید حداقل یک ریشه در c(a,b) c \in ( a , b ) داشته باشد. طبق «قضیه رول» (Rolle's Theorem)، F(t) F' ( t ) حداقل n+1 n + 1 ریشه بین دو ریشه متوالی F(t) F ( t) دارد و F(t) F ^ {\prime \prime } ( t ) حداقل n n ریشه، و F(n+1)(t) F ^ {( n + 1 ) } ( t) حداقل یک ریشه در ξ(a,  b) \xi\in(a,\;b) دارد:

$$ \large \begin {eqnarray}<br /> F ^ { ( n + 1 ) } ( \xi ) = 0 & = & \frac { d ^ { n + 1 } } { d t ^ { n + 1 } }<br /> \left [ f ( t ) - P _ n ( t) - u ( x ) \prod _ { i = 0 } ^ n ( t -x _ i ) \right ] _ { t = \xi }<br /> \nonumber \\<br /> & = & \left [ f ^ { ( n + 1 ) } ( t ) + P _ n ^ { ( n + 1 ) } ( t ) - u ( x ) \frac { d ^ { n + 1 } } { d t ^ { n + 1 } } \prod _ { i = 0 } ^ n ( t - x _ i ) \right ] _ { t = \xi }<br /> \nonumber \\<br /> & = & f ^ { ( n + 1 ) } ( \xi ) - u ( x ) ( n + 1 ) !<br /> \end {eqnarray} $$

معادله آخر به این دلیل است که Pn(t) P _ n ( t) و i=0n(txi) \prod_{i=0}^n(t-x_i) ، به ترتیب، چندجمله‌ای‌هایی از درجه n n و n+1 n+1 از t t هستند. با حل معادله بالا، داریم:

u(x)=f(n+1)(ξ)(n+1)! \large u ( x ) = \frac { f ^ { (n + 1 ) } ( \xi ) } { ( n + 1 ) ! }

اکنون تابع خطا را می‌توان به صورت زیر نوشت:

Rn(x)=u(x)i=0n(xxi)=f(n+1)(ξ)(n+1)!ω(x) \large R _ n ( x ) = u ( x ) \prod _ { i = 0 } ^ n ( x -x _ i ) = \frac { f ^ { ( n + 1 ) } ( \xi ) } {( n + 1 ) ! } \, \omega ( x )

که در آن، ξ(x) \xi ( x ) نقطه‌ای است که بسته به x x ، بین a=x0 a = x _ 0 و b=x n b = x _  n واقع شده است. خطا را می‌توان به صورت کمّی و توسط نُرم دو R n(x) R  _ n ( x ) اندازه‌گیری کرد:

ϵ=Rn(x)2=(abRn2(x)dx)1/2 \large \begin {equation} \epsilon = | | R _ n ( x ) | | _ 2 = \left ( \int _ a ^ b R ^ 2 _ n ( x ) \, d x \right ) ^ { 1 / 2 } \end {equation}

در عمل، اگر f(x) f ( x ) یک چندجمله‌ای مرتبه kn k \le n و در نتیجه  f(n+1)(x)=0  f^ {(n+1)} ( x ) = 0 باشد، آنگاه می‌توان آن را با Pn(x) P _ n ( x ) رون‌یابی دقیق کرد. اما اگر k>n k > n باشد، درون‌یابی یک جمله خطای غیرصفر f(n+1)(x)=(n+1)! f ^ {(n + 1 ) } ( x ) = ( n + 1 ) ! دارد و جمله خطا به صورت زیر در خواهد آمد:

Rn(x)=f(n+1)(ξ)(n+1)!ω(x)=ω(x) \large R _ n ( x ) = \frac { f ^ { ( n + 1 ) } ( \xi ) } { ( n + 1 ) ! } \, \omega ( x ) = \omega ( x )

به دلیل یکتایی درون یابی چند جمله ای ، تحلیل خطای بالا را می‌توان به همه روش‌های دیگر درون‌یابی، از قبیل لاگرانژ و نیوتن نیز اعمال کرد.

مثال درون یابی چند جمله ای

تابع y=f(x)=xsin(2x+π/4)+1 y = f ( x ) = x \sin ( 2 x + \pi / 4 ) + 1 را با یک چندجمله‌ای P3(x) P _ 3 ( x ) با درجه n=3 n = 3 ، طبق n+1=4 n + 1 = 4 نقطه زیر تقریب بزنید.

i0123xi1012yi=f(xi)1.9371.0001.3490.995 \large \begin {equation} \begin {array} { c | | c | c | c | c } \hline i & 0 & 1 & 2 & 3 \\ \hline \hline x _ i & - 1 & 0 & 1 & 2 \\ \hline y _ i= f ( x _ i ) & 1.937 & 1.000 & 1.349 & -0.995 \\\hline \end {array} \nonumber \\ \end {equation}

حل: ابتدا ماتریس وندرموند را به دست می‌آوریم:

V=[1x0x02x031x1x12x131x2x22x231x3x32x33]=[1111100011111249] \large \begin {equation} { \bf V } = \left [ \begin {array} { c c c c } 1 & x _ 0 & x _ 0 ^ 2 & x _ 0 ^ 3 \\ 1 & x _ 1 & x _ 1 ^ 2 & x _ 1 ^ 3 \\ 1 & x _ 2 & x _ 2 ^ 2 & x _ 2 ^ 3 \\ 1 & x _ 3 & x _ 3 ^ 2 & x _ 3 ^ 3 \end {array} \right] = \left [ \begin {array} { c c c c } 1 & -1 & 1 & -1 \\ 1 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 \\ 1 & 2 & 4 & 9 \end {array} \right] \nonumber \\ \end {equation}

و ضرایب را محاسبه می‌کنیم:

a=V1y=V1[f(x0)f(x1)f(x2)f(x3)]=[1111100011111249][1.9371.0001.3490.995]=[1.0000.3690.6430.663] \large \begin {equation} { \bf a } = { \bf V } ^ { - 1 } { \bf y } = { \bf V } ^ { - 1 } \left [ \begin {array} { r } f ( x _ 0 ) \\ f ( x _ 1 ) \\ f ( x _ 2 ) \\ f ( x _ 3 ) \end {array} \right ] = \left [ \begin {array} { c c c c } 1 & -1 & 1 & -1 \\ 1 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 \\ 1 & 2 & 4 & 9 \end {array} \right ] \left [ \begin {array} { r } 1.937 \\ 1.000 \\ 1.349 \\ -0.995 \end {array} \right ] = \left [ \begin {array} { r } 1.000 \\ 0.369 \\ 0.643 \\ -0.663 \end {array} \right ] \nonumber \\ \end {equation}

و در نتیجه، چندجمله‌ای درون‌یاب به عنوان یک مجموع وزن‌دار از n+1=4 n + 1 = 4 تابع توانی به عنوان توابع پایه برای اسپن فضای چندجمله‌ای به دست می‌آید:

P3(x)=j=0najxj=1.0+0.369  x+0.643  x20.663  x3 \large \begin {equation} P _ 3 ( x ) = \sum _ { j = 0 } ^ n a _ j x ^ j = 1 . 0 + 0 . 3 6 9 \; x + 0 . 6 4 3 \; x ^ 2 - 0 . 6 6 3 \; x ^ 3 \nonumber \\ \end {equation}

این چندجمله‌ای درون‌یاب P3(x) P _ 3 ( x ) در شکل زیر نشان داده شده و با تابع اصلی f(x) f ( x ) مقایسه شده است. خطای ϵ\epsilon را می‌توان با یک مجموعه از k>>nk >> n نمونه گسسته u1 u _ 1 ، ... و uk u _ k از تابع f(x) f ( x ) و چندجمله‌ای درون‌یاب P3(x) P _ 3 ( x ) تقریب زد:

ϵ=R3(x)2=(abR32(x)dx)1/2(1ki=1k[f(ui)P3(ui)]2)1/2=0.3063 \large \begin {equation} \epsilon = | | R _ 3 (x )| | _ 2 = \left ( \int _ a ^ b R ^ 2 _ 3 ( x ) \, d x \right ) ^ { 1 / 2 } \approx \left ( \frac { 1 } { k } \sum _ { i = 1 } ^ k [ f (u _ i ) - P _ 3 ( u _ i ) ] ^ 2 \right ) ^ { 1 / 2 } = 0 . 3 0 6 3 \nonumber \\ \end {equation}

درون یابی چندجمله ای

پیاده‌سازی درون یابی چند جمله ای در متلب

کد متلب زیر، پیاده‌سازی روش درون یابی چند جمله ای را نشان می‌دهد.

1function [v P]=PI(u,x,y)  
2    % vectors x and y contain n+1 points and the corresponding function values
3    % vector u contains all discrete samples of the continuous argument of f(x)
4    n=length(x);     % number of interpolating points
5    k=length(u);     % number of discrete sample points
6    v=zeros(1,k);    % polynomial interpolation 
7    P=zeros(n,k);    % power function basis polynomials
8    V=zeros(n);      % Vandermonde matrix
9    for i=1:n
10        for j=1:n
11            V(i,j)=x(i)^(j-1);
12        end
13    end
14    c=inv(V)*y;      % coefficients
15    for i=1:n
16        P(i,:)=u.^(i-1);
17        v=v+c(i)*P(i,:);
18    end
19end

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۱۵ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Numerical Methods
۷ دیدگاه برای «درون یابی چند جمله ای — به زبان ساده»

من فکر میردم میبایست ماتریس معوس وندرموند محاسبه و اعمال میشد نه اینکه خود ماتریس وندرموند. آیا اشتباه میکنم؟ لطفا راهنمایی بفرمایید

در ماتریس وندرموند به جای عدد 8 عدد 9 مرقوم شده است. ssss

با سلام؛

متن اصلاح شد.

از همراهی شما با مجله فرادرس سپاسگزاریم

سلام.بخشید u رو توی matlab باید چی بزنیم که برنامه جواب بده؟

عذر خواهی میکنم منظورم پدیده رونگه یا همون runge phenomenon بود. فکر میکنم میتونه معایب این روش درون یابی و ارجحیت درونیابی اسپلاین رو بخوبی نشون بده. باتشکر از سایت خوبتون.

سلام.
در مطلب «درون یابی اسپلاین — از صفر تا صد» به پدیده رونگه اشاره کرده‌ایم.
سپاس از همراهی‌تان.

راجع به پدیده رانگ هم توضیح دهید. با تشکر.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *