درون یابی اسپلاین – از صفر تا صد

۷۲۱۴ بازدید
آخرین به‌روزرسانی: ۱۶ اردیبهشت ۱۴۰۲
زمان مطالعه: ۱۴ دقیقه
دانلود PDF مقاله
درون یابی اسپلاین – از صفر تا صددرون یابی اسپلاین – از صفر تا صد

در آموزش‌های قبلی مجله فرادرس، با درون‌یابی با استفاده از چندجمله‌ای لاگرانژ آشنا شدیم. در این آموزش، درون‌یابی اسپلاین را معرفی می‌کنیم. در محاسبات عددی، «درون یابی اسپلاین» (Spline Interpolation) یک روش درون‌یابی است که در آن، درون‌یاب، نوع خاصی از یک چندجمله‌ای تکه‌ای است که یک «اسپلاین» (Spline) نامیده می‌شود. درون یابی اسپلاین اغلب نسبت به درون یابی چندجمله‌ای ترجیح داده می‌شود، زیرا حتی وقتی از چندجمله‌ای‌هایی با درجه پایین برای اسپلاین استفاده می‌شود، می‌توان به خطای درون‌یابی کمی دست یافت. درون یابی اسپلاین از مسئله «پدیده رونگه» (Runge's Phenomenon) جلوگیری می‌کند. در پدیده رونگه، هنگام استفاده از چندجمله‌ای‌های مرتبه بالا در درون‌یابی، ممکن است بین نقاط نوسان رخ دهد.

997696

درون یابی اسپلاین

اسپلاین در ابتدا اصطلاحی بود که برای خط‌کش‌های کشسان به کار می‌رفت. این خط‌کش‌ها قابلیت خم شدن برای عبور از تعدادی از نقاط از پیش تعریف شده (گره) داشتند.

از این اسپلاین‌ها برای تهیه نقشه‌های فنی در ساخت کشتی استفاده می‌شد.

درون یابی اسپلاین
شکل ۱: درون یابی با اسپلاین‌های مکعبی بین هشت نقطه

روش مدل‌سازی ریاضی شکل این خط‌کش‌های کشسانِ ثابت با n+1n + 1 نقطه {(xi,yi):i=0,1,,n}\left \{ ( x _ i , y _ i ) : i = 0 , 1 , \cdots , n \right \}، در حقیقت، درون‌یابی بین همه زوج نقطه‌های (xi1,yi1)( x _{i-1} , y _ {i - 1} ) و (xi,yi)( x _ i , y _ i ) با استفاده از چندجمله‌ای y=qi(x)y = q _ i ( x ) است که در آن، i=1,2,,ni = 1,2, \cdots , n.

انحنای منحنی y=f(x)y = f ( x) به صورت زیر بیان می‌شود:

$$ \large \kappa = \frac { y^{\prime \prime} } { ( 1 + y' ^ 2 ) ^ { 3 / 2 } } $$

از آنجایی که شکل اسپلاین به گونه‌ای است که خمش را (تحت قید عبور از همه نقاط) کمینه کند، yy' و yy ^{\prime \prime} در همه جا و همه نقاط پیوسته خواهند بود. به عبارت دیگر، خواهیم داشت:

{qi(xi)=qi+1(xi)qi(xi)=qi+1(xi)1in1\large \begin {cases} q' _ i ( x _ i ) = q' _ { i + 1 } ( x _ i ) \\ q^{\prime \prime} _ i ( x _ i ) = q^{\prime \prime} _ {i + 1 } ( x _ i ) \end {cases} \qquad 1 \le i \le n - 1

این امر زمانی امکان‌پذیر است که چندجمله‌ای‌ها از درجه ۵ یا بالاتر باشند. روش کلاسیک برای استفاده از چندجمله‌ای درجه ۳، اسپلاین‌ مکعبی (Cubic Spline) نامیده می‌شود که در آن، مشتق اول پیوسته است، اما مشتق دوم خیر.

الگوریتم یافتن اسپلاین مکعبی درون‌یاب

در این بخش، ابتدا اسپلاین مکعبی را برای درون‌یابی دو نقطه بیان کرده و در ادامه، فرمول کلی آن را ارائه خواهیم کرد.

درون یابی اسپلاین مکعبی بین دو نقطه

چندجمله‌ای مرتبه سوم q(x)q ( x) را در نظر بگیرید که زوج نقطه (x1,y1)(x_1,y _ 1 ) و (x2,y2)( x _ 2 , y _2 ) را درون‌یابی می‌کند:

q(x1)=y1q(x2)=y2q(x1)=k1q(x2)=k2\large \begin {align*} q ( x _ 1 ) & = y _ 1 \\ q ( x _ 2 ) & = y _ 2 \\ q' ( x _ 1 ) & = k _ 1 \\ q' ( x _ 2 ) & = k _ 2 \end {align*}

می‌توانیم فرم متقارن زیر را بنویسیم که تساوی‌های بالا در آن صدق می‌کنند:

q(x)=(1t(x))y1+t(x)y2+t(x)(1t(x))((1t(x))a+t(x)b)        (1)\large q ( x ) = \big ( 1 - t ( x ) \big) \, y _ 1 + t ( x ) \, y _ 2 + t ( x ) \big ( 1 - t ( x ) \big ) \Big( \big( 1 - t ( x ) \big)\, a + t ( x ) \, b \Big ) \;\;\;\; (1)

که در آن:

t(x)=xx1x2x1,        (2)a=k1(x2x1)(y2y1),        (3)b=k2(x2x1)+(y2y1).        (4)\large \begin {align*} t ( x ) & = \frac { x - x _ 1 } { x _ 2 -x _ 1 } ,\;\;\;\; (2) \\ a & = k _ 1 ( x _ 2 - x _ 1 ) - ( y _ 2 - y _ 1 ) , \;\;\;\; (3) \\ b & = - k _ 2 ( x _ 2 - x _ 1 ) + ( y _ 2 - y _ 1 ) . \;\; \; \; (4) \end {align*}

با توجه به تساوی زیر:

q=dqdx=dqdtdtdx=dqdt1x2x1\large q' = \frac { d q } { d x } = \frac { d q } { d t } \frac { d t } { d x } = \frac { d q } { d t } \frac { 1 } { x _ 2 - x _ 1 }

این روابط را خواهیم داشت:

q=y2y1x2x1+(12t)a(1t)+btx2x1+t(1t)bax2x1,        (5)q=2b2a+(ab)3t(x2x1)2.        (6)\large \begin {align*} q' & = \frac { y _ 2 - y _ 1 } { x _ 2 -x _ 1 } + ( 1 - 2 t ) \frac { a ( 1 - t ) + b t } { x _ 2 - x _ 1 } + t ( 1 - t ) \frac { b - a } { x _ 2 - x _ 1 } , \;\;\;\;(5) \\ \large q^{\prime \prime} & = 2 \frac { b - 2 a + ( a - b ) 3 t } { { ( x _ 2 -x _ 1 ) } ^ 2 } . \;\;\;\; (6) \end {align*}

با قرار دادن x=x1x = x _ 1 و x=x2x = x _ 2، به ترتیب در معادلات (۵) و (۶) با استفاده از (۲)، مشتق‌های اول q(x1)=k1q' ( x _ 1 ) = k _ 1 و q(x2)=k2q' (x_ 2 ) = k _ 2 و مشتق‌های دوم زیر را به دست خواهیم آورد:

q(x1)=2b2a(x2x1)2        (7)q(x2)=2a2b(x2x1)2        (8)\large \begin {align*} q^{\prime \prime} ( x _ 1 ) = 2 \frac { b - 2 a } { { ( x _ 2 - x _ 1 ) } ^ 2 } \;\;\;\; (7) \\ q^{\prime\prime} ( x _ 2 ) = 2 \frac { a - 2 b } { { ( x _ 2 - x _ 1 ) } ^ 2 } \;\;\;\; (8) \end {align*}

فرمول عمومی درون یابی اسپلاین مکعبی

اکنون اگر (xi,yi)(x_i,y_i) را برای i=0,1,...,ni = 0, 1 , ... , n و به عنوان n+1n + 1 نقطه در نظر بگیریم، تعداد nn چندجمله‌ای مرتبه سوم درون‌یاب yy در بازه xi1xxix _{i-1} \le x \le x _i برای i=1,...,ni= 1 , ... , n خواهیم داشت، به گونه‌ای که qi(xi)=qi+1(xi)q' _ i ( x _ i ) = q' _ {i+1} (x_i) برای i=1,...,n1i = 1 , ... , n - 1 برقرار است:

qi=(1t)yi1+tyi+t(1t)((1t)ai+tbi)        (9)\large q _ i = ( 1 - t ) \, y _ { i - 1 } + t \, y _ i + t ( 1 -t ) \big ( ( 1 - t ) \, a _ i + t \, b _ i \big ) \;\;\;\; (9)

که در آن، i=1,2,...,ni = 1 , 2 , ... , n و t=xxi1xixi1t = \frac {x - x _{i-1} } {x _ i - x _ {i-1}} است و در نتیجه، nn چندجمله‌ای خواهیم داشت که با یکدیگر تابعی مشتق‌پذیر در بازه x0xxnx _ 0 \le x \le x _ n تعریف می‌کنند و برای i=1,...,ni = 1 , ... , n داریم:

ai=ki1(xixi1)(yiyi1)        (10)\large a _ i = k _ { i - 1 } ( x _ i - x _ { i - 1 } ) - ( y _ i - y _ { i - 1 } ) \;\;\;\; (10)

bi=ki(xixi1)+(yiyi1)        (11)\large b _ i = - k _ i ( x _ i - x _ { i - 1 } ) + (y _ i - y _ { i - 1 } ) \;\;\;\; (11)

که در آن:

k0=q1(x0)          (12)ki=qi(xi)=qi+1(xi)i=1,,n1        (13)kn=qn(xn)          (14)\large \begin {align*} k _ 0 & = q' _ 1 ( x _ 0 ) \;\;\;\;\; (12)\\ k _ i & = q _ i' ( x _ i ) = q _ { i + 1 }' ( x _ i ) \qquad i = 1 , \dotsc , n - 1 \;\;\;\; (13)\\ k _ n & = q _ n' ( x _ n ) \;\;\;\;\; (14)\end {align*}

اگر دنباله k0k _ 0، k1k _ 1، ... و knk _ n به گونه‌ای باشد که برای i=1,...,n1i = 1 , ... , n - 1 تساوی qi(xi)=qi+1(xi)q ^{\prime \prime } _ i ( x _ i ) = q^{\prime \prime }_{i+1} ( x _ i ) برقرار باشد، آنگاه تابع حاصل یک مشتق دوم پیوسته نیز خواهد داشت.

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

درون یابی اسپلاین

از معادلات (۷)، (۸)، (۱۰) و (۱۱) رابطه زیر را برای i=1,...,n1i = 1 , ... , n - 1 نتیجه می‌گیریم:

ki1xixi1+(1xixi1+1xi+1xi)2ki+ki+1xi+1xi=3(yiyi1(xixi1)2+yi+1yi(xi+1xi)2)          (15)\large \frac { k _ { i - 1 } } { x _ i - x _ { i - 1 } } + \left ( \frac { 1 } { x _ i - x _ { i - 1 } } + \frac { 1 }{ { x _ { i + 1 } - x _ i } } \right ) 2 k _ i + \frac { k _ { i + 1 } } { { x _ { i + 1 } - x _ i } } \\ \large = 3 \left ( \frac { y _ i - y _ { i - 1 } } { { ( x _ i - x _ { i - 1 } ) } ^ 2 } + \frac { y _ { i + 1 } - y _ i } { { ( x _ { i + 1 } - x _ i ) } ^ 2 } \right ) \;\;\;\;\; (15)

روابط (۱۵) در حقیقت n1n - 1 معادله خطی برای n+1n + 1 مقدار k0k _ 0، k1k _ 1، ... و knk _ n هستند.

در خط‌کش‌های کشسان که مدل درون یابی اسپلاین هستند، سمت چپ یا چپ‌‌ترین گره یا همان نقطه و سمت راست یا راست‌ترین گره خط‌کش می‌تواند آزادانه حرکت کند و به همین دلیل، با q=0q^{\prime\prime} = 0 فرم یک خط مستقیم را به خود می‌گیرد. از آنجایی که qq^{\prime \prime} باید یک تابع پیوسته از xx باشد، برای اسپلاین‌های طبیعی (Natural Splines) علاوه بر n1n - 1 معادله خطی (۱۵)، باید داشته باشیم:

q1(x0)=23(y1y0)(k1+2k0)(x1x0)(x1x0)2=0,qn(xn)=23(ynyn1)(2kn+kn1)(xnxn1)(xnxn1)2=0\large \begin {align*} q^ {\prime \prime} _ 1 ( x _ 0 ) & = 2 \frac { 3 ( y _ 1 - y _ 0 ) -( k _ 1 + 2 k _ 0 ) ( x _ 1 - x _ 0 ) } { { ( x _ 1 - x _ 0 ) } ^ 2 } = 0 , \\ q^ {\prime \prime} _ n ( x _ n ) & = - 2 \frac { 3 ( y _ n - y _ { n - 1 } ) - ( 2 k _ n + k _ { n - 1 } ) ( x _ n - x _ { n - 1 } ) } { { ( x _ n - x _ { n - 1 } ) } ^ 2 } = 0 \end {align*}

این یعنی:

2x1x0k0+1x1x0k1=3y1y0(x1x0)2,          (16)1xnxn1kn1+2xnxn1kn=3ynyn1(xnxn1)2.        (17)\large \begin{align*} \frac { 2 } { x _ 1 - x _ 0 } k _ 0 +\frac { 1 } { x _ 1 - x _ 0 } k _ 1 & = 3 \frac { y _ 1 - y _ 0 } { ( x _ 1 - x _ 0 ) ^ 2 } , \;\; \;\;\; (16) \\ \frac { 1 } { x _ n - x _ { n - 1 } } k _ { n - 1 } + \frac { 2 } { x _ n - x _ { n - 1 } } k _ n & = 3 \frac { y _ n - y _ { n - 1 } } { ( x _ n - x _ { n - 1 } ) ^ 2 } . \;\;\;\; (17) \end {align*}

در نهایت، (۱۵) همراه با (۱۶) و (۱۷)، تعداد n+1n + 1 معادله خطی را تشکیل می‌دهند که به صورت یکتا n+1n + 1 پارامتر k0k_0، k1k _ 1، ... و knk _ n را تعریف می‌کنند.

موارد دیگری نیز وجود دارند که می‌توان آن‌ها را نیز در نظر گرفت: «اسپلاین مقید» (Clamped Spline) که شیب را در انتهای اسپلاین مشخص می‌کند، و «اسپلاین غیرگره‌ای» (Not-a-knot Spline)، که در آن، مشتق سوم نیز در نقاط x1x _ 1 و xN1x _ { N - 1 } باید پیوسته باشد. برای اسپلاین غیرگره‌ای، معادلات زیر را نیز داریم:

q1(x1)=q2(x1)1Δx12k0+(1Δx121Δx22)k11Δx22k2=2(Δy1Δx13Δy2Δx23)\large q^{\prime \prime \prime} _ 1 ( x _ 1 ) = q^{\prime \prime \prime} _ 2 ( x _ 1 ) \\ \large \Rightarrow \frac { 1 } { \Delta x _ 1 ^ 2 } k _ 0 + \left ( \frac { 1 } { \Delta x _ 1 ^ 2 } - \frac { 1 } { \Delta x _ 2 ^ 2 } \right ) k _ 1 - \frac { 1 } { \Delta x _ 2 ^ 2 } k _ 2 \\ \large = 2 \left ( \frac { \Delta y _ 1 } { \Delta x _ 1 ^ 3 } - \frac { \Delta y _ 2 } { \Delta x _ 2 ^ 3 } \right )

qn1(xn1)=qn(xn1)1Δxn12kn2+(1Δxn121Δxn2)kn11Δxn2kn=2(Δyn1Δxn13ΔynΔxn3)\large q^{\prime \prime \prime} _ { n - 1 } ( x _ { n - 1 }) = q^{\prime \prime \prime} _ n ( x _ { n - 1 } ) \\ \large \Rightarrow \frac { 1 } { \Delta x _ { n - 1 } ^ 2 } k _ { n - 2 } + \left ( \frac { 1 } { \Delta x _ { n - 1 } ^ 2 } - \frac { 1 }{ \Delta x _ n ^ 2 } \right ) k _ { n - 1 } - \frac { 1 } { \Delta x _ n ^ 2 } k _ n \\ \large = 2 \left ( \frac { \Delta y _ { n - 1 } }{ \Delta x _ { n - 1 } ^ 3 } - \frac { \Delta y _ n } { \Delta x _ n ^ 3 } \right )

که در آن، Δxi=xixi1\Delta x _ i = x _ i - x _ { i - 1 } و Δyi=yiyi1\Delta y _ i = y _ i - y _ { i - 1 }.

مثال درون یابی اسپلاین

می‌خواهیم دو چندجمله‌ای برای درون‌یابی سه نقطه (1,0.5)( -1, 0.5)، (0,0)(0, 0 ) و (3,3)( 3 , 3 ) با استفاده از روش درون یابی اسپلاین به دست آوریم. با نوشتن معادلات لازم، به دستگاه معادلات سه‌قطری زیر برای مقادیر k0k _ 0، k1k _ 1 و k2k _ 2 می‌رسیم:

[a11a120a21a22a230a32a33][k0k1k2]=[b1b2b3]\large \begin {bmatrix} a _ { 1 1 } & a _ { 1 2 } & 0 \\ a _ { 2 1 } & a _ { 2 2 } & a _ { 2 3 } \\ 0 & a _ { 3 2 } & a _ { 3 3 } \\ \end {bmatrix} \begin {bmatrix} k _ 0 \\ k _ 1 \\ k _ 2 \\ \end {bmatrix} = \begin {bmatrix} b _ 1 \\ b _ 2 \\ b _ 3 \\ \end {bmatrix}

که در آن:

a11=2x1x0a12=1x1x0a21=1x1x0a22=2 (1x1x0+1x2x1)a23=1x2x1a32=1x2x1a33=2x2x1b1=3 y1y0(x1x0)2b2=3 (y1y0(x1x0)2+y2y1(x2x1)2)b3=3 y2y1(x2x1)2\large \begin {align*} a _ { 1 1 } & = \frac { 2 } { x _ 1 - x _ 0 } \\ a _ { 1 2 } & = \frac { 1 } { x _ 1 - x _ 0 } \\ a _ { 2 1 } & = \frac { 1 } { x _ 1 - x _ 0 } \\ a _ { 2 2 } & = 2 \ \left ( \frac { 1 } { x _ 1 - x _ 0 } + \frac { 1 } { { x _ 2 - x _ 1 } } \right ) \\ a _ {2 3 } & = \frac { 1 } { { x _ 2 - x _ 1 } } \\ a _ { 3 2 } & = \frac { 1 } { x _ 2 - x _ 1 } \\ a _ { 3 3 } & = \frac { 2 } { x _ 2 - x _ 1 } \\ b _ 1 & = 3\ \frac { y _ 1 - y _ 0 } { ( x _ 1 - x _ 0 ) ^ 2 } \\ b _ 2 & = 3 \ \left ( \frac { y _ 1 - y _ 0 } { { ( x _ 1 -x _ 0 ) } ^ 2 } + \frac { y _ 2 - y _ 1 } { { ( x _ 2 -x _ 1 ) } ^ 2 } \right ) \\ b _ 3 & = 3 \ \frac { y _ 2 - y _ 1 } { ( x _ 2 -x _ 1 ) ^ 2 } \end {align*}

بنابراین، برای سه نقطه (1,0.5)( -1, 0.5)، (0,0)(0, 0 ) و (3,3)( 3 , 3 ) داریم:

k0=0.6875 , k1=0.1250 , k2=1.5625\large k _ 0 = - 0 . 6 8 7 5 \ ,\ k _ 1 = - 0 . 1 2 5 0 \ ,\ k _ 2 = 1 . 5 6 2 5

و از معادلات (۱۰) و (۱۱)، خواهیم داشت:

a1=k0(x1x0)(y1y0)=0.1875b1=k1(x1x0)+(y1y0)=0.3750a2=k1(x2x1)(y2y1)=3.3750b2=k2(x2x1)+(y2y1)=1.6875\large \begin {align*} a _ 1 & = k _ 0 ( x _ 1 - x _ 0 ) - ( y _ 1 - y _ 0 ) = - 0 . 1 8 7 5 \\ \large b _ 1 & = - k _ 1 ( x _ 1 - x _ 0 ) + ( y _ 1 - y _ 0 ) = - 0 . 3 7 5 0 \\ \large a _ 2 & = k _ 1 ( x _ 2 - x _ 1 ) - ( y _ 2 - y _ 1 ) = - 3 . 3 7 5 0 \\ b _ 2 & = -k _ 2 ( x _ 2 - x _ 1 ) + ( y _ 2 - y _ 1 ) = - 1 . 6 8 7 5 \end {align*}

در شکل ۲، تابع اسپلاین از دو چندجمله‌ای مکعبی q1(x)q _ 1 ( x ) و q2(x)q _ 2 ( x ) تشکیل شده که در رابطه (۹)‌ بیان شد.

درونیابی اسپلاین
شکل ۲: درون‌یابی با اسپلاین‌های خنثای مکعبی بین سه نقطه

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

درون یابی اسپلاین در متلب در قالب تابع cubic_spline به صورت زیر است:

برای آزمایش تابع بالا، کد زیر را می‌نویسیم:

شکل حاصل از اجرای این برنامه به صورت زیر است:

درون یابی اسپلاین در متلب
شکل ۳: نتیجه اجرای برنامه متلب درون یابی اسپلاین

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

^^

بر اساس رای ۳۲ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
WikipediaGitHub
دانلود PDF مقاله
۹ دیدگاه برای «درون یابی اسپلاین – از صفر تا صد»

سلام و درود
چگونه میشود تابع را خودم به دلخواه وارد کنم

با سلام و ارادت ممنون از ارائه مطالب اسپلاین اگر جهت فهم بهتر موضوعات در خصوص نمودار ها یا خروجی شبیه ساز بصورت گرافیکی یا انیمیشن نیز کمک بگیرید بهتر خواهد بود خدا قوت

سلام منظور از multi quadratic interpolation کدام روش درونیابی می باشد ؟ ممنون

سلام
جناب حمیدی من فانکشن را ران کردم در خط 23 ارور دریافت میکنم لطفا بررسی کنید ممنون

سلام عرفان عزیز.
کدهای متلب پیش از انتشار آموزش اعتبارسنجی شده‌اند و ایرادی ندارند.
برای اجرای صحیح کد، ابتدا تابع cubic_splin را ذخیره کنید. سپس پوشه‌ای که تابع را در آنجا ذخیره کرده‌اید، به‌عنوان Current Folder انتخاب کنید. پس از آن، کد مثال را اجرا کنید.
سالم و موفق باشید.

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

سلام، وقت شما بخیر؛

منبع تمامی مقالات مجله فرادرس در صورتیکه ترجمه یا تالیف باشند، در انتهای آن‌ها و بعد از بخش معرفی آموزش‌ها و مطالب مرتبط ذکر شده‌اند.

از اینکه با مجله فرادرس همراه هستید از شما سپاسگزاریم.

سلام خسته نباشید .فکر می کنم یک جای برنامه ایراد داره چون ارور میده

سلام.
برنامه بررسی شد و اشکالی در آن وجود ندارد.
موفق باشید.

نظر شما چیست؟

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