Project 1: Data interpolation

‫ﺑﺴﻢ اﷲ اﻟﺮﺣﻤﻦ اﻟﺮﺣﻴﻢ‬
‫ﻣﺒﺎﻧﻲ ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ﺑﻪ زﺑﺎن ‪C / C++‬‬
‫ﭘﺮوژه ﭘﺎﻳﺎﻧﻲ‬
‫ﺷﻤﺎره ‪2‬‬
‫دروﻧﻴﺎﺑﻲ‬
‫‪ 2-3‬ﻧﻔﺮ‬
‫اﻣﺮوزه ﻳﻜﻲ از ﻣﻬﻤﺘﺮﻳﻦ ﻣﻌﻀﻼت در ﺗﻘﺮﻳﺐ زدن داده ﻫﺎ در رﻳﺎﺿﻴﺎت ﻛﺎرﺑﺮدي دروﻧﻴﺎﺑﻲ ﺗﻌـﺪادي ﻧﻘﻄـﻪ )‬
‫ورودي ( ﺑﻪ ﻛﻤﻚ ﻳﻚ ﺗﺎﺑﻊ ) ﺧﺮوﺟﻲ ( ﻣﻲ ﺑﺎﺷﺪ‪ .‬ﻛﻠﻲ ﺗﺮﻳﻦ ﺻﻮرت ﻳﻚ ﻣﺴﺌﻠﻪ دروﻧﻴﺎﺑﻲ ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ‪:‬‬
‫‪ n‬ﻧﻘﻄﻪ ‪ x1, ... , xn‬و ‪ y1,...,yn‬داده ﺷﺪه اﺳﺖ‪ .‬ﭼﻨﺪ ﺟﻤﻠﻪ اي )‪ pn-1(x‬از درﺟﻪ ﺣـﺪاﻛﺜﺮ‬
‫‪ n-1‬را ﺑﻪ ﻧﺤﻮي ﺑﻴﺎﺑﻴﺪ ﺑﻪ ﻃﻮري ﻛﻪ ﺑﺮاي ﻫﺮ ‪ 0<i≤n‬داﺷﺘﻪ ﺑﺎﺷﻴﻢ ‪pn-1(xi) = yi‬‬
‫ﺑﺮاي ﻣﺜﺎل ﺗﺎﺑﻊ ‪ p2(x) = 1 + 4x – 2x2‬ﻧﻘﺎط )‪ (-2,-15), (3,-5), (1,3‬را دروﻧﻴﺎﺑﻲ ﻣﻲ ﻧﻤﺎﻳﺪ‪.‬‬
‫اﻧﻮاع ﻣﺨﺘﻠﻔﻲ از دروﻧﻴﺎﺑﻲ ﺑﺮ ﺣﺴﺐ ﻛﺎراﻳﻲ و دﻗﺖ آﻧﻬﺎ وﺟﻮد دارﻧﺪ‪ .‬ﻫﺪف ﺷﻤﺎ در اﻳﻦ ﭘﺮوژه ﭘﻴﺎده ﺳﺎزي ﭼﻨﺪ دروﻧﻴـﺎﺑﻲ‬
‫ﻛﺎراﻣﺪ ﻣﻲ ﺑﺎﺷﺪ‪.‬‬
‫•‬
‫دروﻧﻴﺎﺑﻲ ﺑﻪ ﻛﻤﻚ ﻣﺎﺗﺮﻳﺲ واﻧﺪرﻣﻮﻧﺪ‪:1‬‬
‫ﻓﺮض ﻛﻨﻴﺪ ﭼﻨﺪ ﺟﻤﻠﻪ اي )‪ p(x‬ﺑﻪ ﺻﻮرت زﻳﺮ ﺑﺎﺷﺪ‪:‬‬
‫‪pn-1(x) = a1 + a2x + a3x2 + ... + anxn-1 = y‬‬
‫ﺑﺪﻳﻬﻲ اﺳﺖ ﻛﻪ ﺑﺎ ﺣﻞ ﻣﻌﺎدﻟﻪ ﻣﺎﺗﺮﻳﺴﻲ زﻳﺮ ﻣﻲ ﺗﻮان ﺿﺮاﻳﺐ ‪ ai‬را ﺑﺪﺳﺖ آورد‪:‬‬
‫⎤ ‪x1n−1 ⎤ ⎡ a1 ⎤ ⎡ y1‬‬
‫⎥ ⎢ ⎥ ⎢⎥‬
‫⎥ ‪x2n−1 ⎥ ⎢ a 2 ⎥ ⎢ y 2‬‬
‫⎥ ‪x3n−1 ⎥ ⎢ a3 ⎥ = ⎢ y3‬‬
‫⎥ ⎢ ⎥ ⎢⎥‬
‫⎥ ‪M ⎥⎢ M ⎥ ⎢ M‬‬
‫⎦⎥ ‪xnn−1 ⎥⎦ ⎢⎣an ⎥⎦ ⎢⎣ y n‬‬
‫ﺣﻞ و ﺑﺮرﺳﻲ اﻳﻦ ﻣﺎﺗﺮﻳﺲ ﺑﺮ ﻋﻬﺪه ﺷﻤﺎ!‬
‫‪Vandermonde Matrix 1‬‬
‫‪L‬‬
‫‪x12‬‬
‫‪x1‬‬
‫‪1‬‬
‫‪L‬‬
‫‪x22‬‬
‫‪x2‬‬
‫‪1‬‬
‫‪L‬‬
‫‪2‬‬
‫‪3‬‬
‫‪x‬‬
‫‪x3‬‬
‫‪M‬‬
‫‪M‬‬
‫‪O‬‬
‫‪L‬‬
‫‪2‬‬
‫‪n‬‬
‫‪x‬‬
‫‪xn‬‬
‫‪1‬‬
‫‪M‬‬
‫‪1‬‬
‫⎡‬
‫⎢‬
‫⎢‬
‫⎢‬
‫⎢‬
‫⎢‬
‫⎢‬
‫⎣‬
‫•‬
‫دروﻧﻴﺎﺑﻲ ﭼﻨﺪ ﺟﻤﻠﻪ اي و دروﻧﻴﺎﺑﻲ ﻫﺮﻣﻴﺖ ﻣﻜﻌﺒﻲ‪:‬‬
‫دروﻧﻴﺎﺑﻲ ﺑﻪ ﻛﻤﻚ ﻣﺎﺗﺮﻳﺲ واﻧﺪوﻣﻮﻧﺪ ﺷﻴﻮه ﺳﺮراﺳﺘﻲ ﺑـﺮاي ﺗﻘﺮﻳـﺐ اﺳـﺖ اﻣـﺎ اﻳـﺮاد‬
‫اﺳﺎﺳﻲ آن ﻛﻨﺪي ﺑﻴﺶ از ﺣﺪ اﺳﺖ‪ .‬در اﻳﻦ راﺳﺘﺎ ﺗﻘﺮﻳﺐ ﻫﺎي ﺑﻬﺘﺮ و ﻛﺎراﻣﺪ ﺗﺮي اراﺋـﻪ‬
‫ﺷﺪه اﺳﺖ‪ .‬ﻧﻤﻮﻧﻪ از اﻳﻦ ﺗﻘﺮﻳﺐ ﻫﺎ ﺗﻘﺮﻳﺐ ﻫﺮﻣﻴﺖ درﺟﻪ ﺳﻪ ﻣﻲ ﺑﺎﺷﺪ‪.‬‬
‫ﻓﺮق اﺳﺎﺳﻲ اﻳﻦ دروﻧﻴﺎﺑﻲ ﺑﺎ ﻣﻮارد ﻣﺸﺎﺑﻪ ﺑـﻪ روش واﻧﺪرﻣﻮﻧـﺪ دﺧﻴـﻞ ﻛـﺮدن‬
‫ﻣﺸﺘﻘﺎت ﺗﺎﺑﻊ در ﻣﺤﺎﺳﺒﻪ ﺗﺎﺑﻊ اﺳﺖ ﺗﺎ ﻧﻤﻮدار ﻫﺎي ﻫﻤﻮارﺗﺮي ﺑﺪﺳﺖ آﻳﺪ‪.2‬‬
‫ﺑﻪ ﺻﻮرت ﺧﻼﺻﻪ در ﻣﺴﺌﻠﻪ دروﻧﻴﺎﺑﻲ ﻫﺮﻣﻴﺖ ﺷﻤﺎ ﻣﻲ ﺑﺎﻳﺴﺖ ﺑﺎ داﺷﺘﻦ ﻣﻘﺎدﻳﺮ‬
‫‪ xr, xl, yr, yl‬و ﻣﻘﺎدﻳﺮ ﻣﺸﺘﻘﺎت ‪ sr,sl‬ﻛﻪ در آن ‪ r,l‬ﺑﻪ ﺗﺮﺗﻴﺐ ﺑﻪ ﻣﻌﻨﺎي ﭼﭗ و راﺳﺖ ﻣـﻲ‬
‫ﺑﺎﺷﻨﺪ ﺿﺮاﻳﺐ ‪ a,b,c,d‬را در ﻣﻌﺎدﻟﻪ زﻳﺮ ﭘﻴﺪا ﻧﻤﺎﻳﻴﺪ‪:‬‬
‫)‪q(z) = a + b(z-xL) + c(z-xL)2 + d(z-xL)2(z-xR‬‬
‫اﻟﺒﺘﻪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ‪:‬‬
‫‪q(xL) = yL‬‬
‫‪q(xR) = yR‬‬
‫‪q'(xL) = sL‬‬
‫‪q'(xR) = yR‬‬
‫ﺑﺮاي اﻳﻨﻜﺎر ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ‬
‫)‪q'(z) = b + 2c(z-xL) + d(2(z-xL)(z-xR) + (z-xL)2‬‬
‫ﺿﺮاﻳﺐ ‪ a,b,c,d‬ﺑﻪ آﺳﺎﻧﻲ ﺑﺪﺳﺖ ﺧﻮاﻫﻨﺪ آﻣﺪ‪.‬‬
‫‪ 2‬ﺗﻌﺮﻳﻒ دﻗﻴﻖ اﻳﻨﻜﻪ واﻗﻌﺎً ﻳﻚ ﻧﻤﻮدار ﻫﻤﻮار ‪ smooth‬ﺑﻪ ﭼﻪ ﻣﻌﻨﻲ ﻣﻲ ﺑﺎﺷﺪ را در رﻳﺎﺿﻴﺎت ‪ 2‬ﻓﺮا ﺧﻮاﻫﻴﺪ ﮔﺮﻓﺖ‪ .‬در ﺣﺎل ﺣﺎﺿﺮ ﺗﻨﻬﺎ ﺑﻪ‬
‫ﺷﻬﻮد ﺧﻮد در اﻳﻦ زﻣﻴﻨﻪ ﺗﻜﻴﻪ ﻛﻨﻴﺪ‪.‬‬
‫• دروﻧﻴﺎﺑﻲ اﺳﭙﻼﻳﻦ ﻣﻜﻌﺒﻲ‪:‬‬
‫ﻫﺮﻣﻴﺖ ﻧﻤﻮدار ﻫﺎي ﻫﻤﻮار و ﺧﻮﺑﻲ را ﺑﺮاي ﻣﺎ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ وﻟﻲ اﻳﻦ ﻫﻨﻮز ﻛﺎﻓﻲ ﻧﻴﺴﺖ‪ .‬ﺑﺮاي ﻣﺜﺎل ﺗﻘﺮﻳﺐ ﻫﺎﻳﻲ‬
‫ﻛﻪ ﻫﺮﻣﻴﺖ ﺑﺮاي ﺗﺎﺑﻌﻲ ﻣﺜﻞ )‪ e-2xsin(10πx‬ﺑﻪ ازاي ﺗﻌﺪاد ﻧﻘﺎط ﻣﺘﻮﺳﻂ اراﺋﻪ ﻣﻲ ﻛﻨﺪ ﺑﺴﻴﺎر ﺑـﺪ اﺳـﺖ‪ .‬ﺑـﺮاي‬
‫ﻫﻤﻴﻦ ﻧﻮع ﺑﻬﺘﺮ ) و اﻟﺒﺘﻪ ﻛﻤﻲ ﺳﺨﺖ ﺗﺮ ﺑﺮاي ﺷﻤﺎ! ( دروﻧﻴﺎﺑﻲ ﺑﻪ ﻧﺎم اﺳﭙﻼﻳﻦ وﺟﻮد دارد ﻛﻪ در آن ﺗﻀﻤﻴﻦ ﺷـﺪه‬
‫اﺳﺖ ﺧﻮد ﺗﺎﺑﻊ و ﻣﺸﺘﻖ اول و ﻣﺸﺘﻖ دوم آن ﭘﻴﻮﺳﺘﻪ ﻣﻲ ﺑﺎﺷﻨﺪ‪ .‬اﻳﻦ ﺷﺮاﻳﻂ ﺑﺎ ﻣﻌﺎدﻟﻪ زﻳﺮ ﻗﺎﺑﻞ ﭘﻴﺎده ﺳﺎزي اﺳﺖ‪:‬‬
‫‪yi' − si‬‬
‫'‪s + s − 2 y‬‬
‫) ‪( z − xi ) 2 + i i +1 2 i ( z − xi ) 2 ( z − xi +1‬‬
‫‪Δxi‬‬
‫) ‪(Δxi‬‬
‫‪q i ( z ) = y i + s i ( z − xi ) +‬‬
‫ﺑﺮاي آﻧﻜﻪ ﻣﺸﺘﻖ دوم ﭘﻴﻮﺳﺘﻪ ﺑﺎﺷﺪ ﺑﺎﻳﺪ داﺷﺘﻪ ﺑﺎﺷﻴﻢ‪:‬‬
‫‪2‬‬
‫) ' ‪(2 si +1 + si − 3 yi‬‬
‫‪Δxi‬‬
‫‪2‬‬
‫) ' ‪(−2si +1 − si + 2 + 3 yi +1‬‬
‫‪Δxi +1‬‬
‫= ) ‪q' 'i ( xi +1‬‬
‫= ) ‪q' 'i +1 ( xi +1‬‬
‫اﮔﺮ ﻛﻤﻲ دﻗﺖ ﻛﻨﻴﺪ ﺑﺎ ﻛﻤﻚ ﻋﺒﺎرت ﺑﺎﻻ ﻣﻲ ﺗﻮان ﻫﻤﻪ ﺿﺮاﻳﺐ ‪ si‬را ﺑﻪ ﺟﺰ ‪ s1‬و ‪ sn‬ﺗﻌﻴﻴﻦ ﻛﻨﻴﻢ‪ .‬ﺷﺮاﻳﻂ اوﻟﻴﻪ اي ﻛـﻪ‬
‫ﺑﺮ ‪ s1‬و ‪ sn‬اﻋﻤﺎل ﻣﻲ ﺷﻮﻧﺪ ﺑﻪ اﻳﺠﺎد ﺳﻪ دﺳﺘﻪ اﺳﭙﻼﻳﻦ ﻣﺨﺘﻠﻒ ﻣﻲ اﻧﺠﺎﻣﻨﺪ‪:‬‬
‫‪ .1‬اﺳﭙﻼﻳﻦ ﻛﺎﻣﻞ‬
‫در اﻳﻦ اﺳﭙﻼﻳﻦ ﻣﻘﺪار ‪ s1‬و ‪ sn‬ﻣﺴﺘﻘﻴﻤﺎ داده ﻣﻲ ﺷﻮد‪.‬‬
‫‪ .2‬اﺳﭙﻼﻳﻦ ﻃﺒﻴﻌﻲ‬
‫ﻣﻘﺎدﻳﺮ ‪ s1‬و ‪ sn‬ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﺧﻮاﻫﺪ ﺑﻮد‪.‬‬
‫‪ .3‬اﺳﭙﻼﻳﻦ ‪NaK‬‬
‫در اﻳﻦ ﻧﻮع اﺳﭙﻼﻳﻦ ﻣﻘﺎدﻳﺮ ‪ s1‬و ‪ sn‬ﺑﺎ اﻋﻤﺎل ﻣﺸﺘﻖ ﺳﻮم ﺑﻪ ﺷﻜﻞ‬
‫'‪s + s − 2 y‬‬
‫‪q' ' 'i ( x) = 6 i i +1 2 i‬‬
‫) ‪(Δxi‬‬
‫ﺑﺪﺳﺖ ﻣﻲ آﻳﻨﺪ‪.‬‬
‫ﺑﺮاي اﻫﺪاف اﻳﻦ ﭘﺮوژه ﺗﻨﻬﺎ ﭘﻴﺎده ﺳﺎزي اﺳﭙﻼﻳﻦ ﻃﺒﻴﻌﻲ ﻛﺎﻓﻲ اﺳﺖ‪.‬‬
‫ورودي‪/‬ﺧﺮوﺟﻲ‪:‬‬
‫ورودي ﺧــﻮد را از ‪ standard input‬ﺑﺨﻮاﻧﻴــﺪ و ﺧﺮوﺟــﻲ ﺗــﺎن را ﺑــﺮ روي‬
‫‪ standard output‬ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫‪3‬‬
‫‪ .1‬ورودي ﺑﺮﻧﺎﻣﻪ‪:‬‬
‫ورودي ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ اﺑﺘﺪا ﻋﺪد ‪ ) n‬ﺗﻌﺪاد ﻧﻘـﺎط ( و ﺑﻌـﺪ از ان ‪ n‬زوج ﻧﻘﻄـﻪ ﺑـﻪ ﺷـﻜﻞ‬
‫‪ xi,yi‬ﻣﻲ ﺑﺎﺷﺪ‪.‬‬
‫‪ .2‬ﺧﺮوﺟﻲ ﻫﺎي ﺑﺮﻧﺎﻣﻪ‪:‬‬
‫ƒ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﻣﻲ ﺑﺎﻳﺴﺖ دروﻧﻴﺎﺑﻲ ﻧﻘﺎط ورودي را ﺑﻪ ﻛﻤﻚ ﻣـﺎﺗﺮﻳﺲ واﻧﺪرﻣﻮﻧـﺪ‪ ،‬روش‬
‫ﻫﺮﻣﻴﺖ و ﻳﻜﻲ از اﺳﭙﻼﻳﻦ ﻫﺎ دروﻧﻴﺎﺑﻲ ﻛﻨﺪ‪ .‬ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﺑﺎﻳﺪ ﻫﺮ ﺳـﻪ دروﻧﻴـﺎﺑﻲ را‬
‫ﭘﻴﺎده ﺳﺎزي ﻧﻤﺎﻳﻴﺪ‪ .‬در ﻣﻴﺎن اﺳﭙﻼﻳﻦ ﻫﺎ ﻫﻴﭽﻜﺪام اوﻟﻮﻳﺘﻲ ﺑﺮ دﻳﮕـﺮي ﻧﺪارﻧـﺪ‪ .‬ﺑـﺮاي‬
‫ﻫﻤﻴﻦ ﺗﻮﺻﻴﻪ ﻣﻲ ﻛﻨﻴﻢ از اﺳﭙﻼﻳﻦ ﻃﺒﻴﻌﻲ ﻛﻪ راﺣﺘﺘﺮ اﺳﺖ اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪ .‬در اﻧﺘﻬﺎ ﺳﻪ‬
‫ﭼﻨﺪ ﺟﻤﻠﻪ اي ﻛﻪ ﺣﺎﺻﻞ از دروﻧﻴﺎﺑﻲ ﻧﻘﺎﻃﻪ ﻫﺴﺘﻨﺪ را ﺑﻨﻮﻳﺴﻴﺪ‪.‬‬
‫‪ .3‬ﻗﺎﺑﻠﻴﺖ ﻫﺎي اﺿﺎﻓﻲ‪:‬‬
‫ƒ ﭘﻴﺎده ﺳﺎزي ﻣﻮارد زﻳﺮ ﻣﺸﻤﻮل ﻧﻤﺮه اﺿﺎﻓﻲ ﺧﻮاﻫﺪ ﺑﻮد‪:‬‬
‫• اﺳﺘﻔﺎده از روش ﻧﻴﻮﺗﻦ ﺑﺮاي دروﻧﻴﺎﺑﻲ‪.‬‬
‫• ﻛﺸﻴﺪن ﻧﻤﻮدار ﭼﻨﺪ ﺟﻤﻠﻪ اي دروﻧﻴﺎﺑﻲ ﺷﺪه ﺑـﺮ روي ﺻـﻔﺤﻪ ﻣـﺎﻧﻴﺘﻮر ﺑـﺎ‬
‫ﻛﻤﻚ ﻛﺘﺎﺑﺨﺘﺎﻧﻪ ﻫﺎي ﮔﺮاﻓﻴﻜﻲ ﻣﻮﺟﻮد ﺑﺮاي ‪C/C++‬‬
‫• ﺗﻮﺟﻪ ﺑﺴﻴﺎر ﻣﻬﻢ‪:‬‬
‫ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺎﻳﺪ در زﻣﺎن ﺗﺤﻮﻳﻞ ﻛﻤﭙﺎﻳﻞ و اﺟﺮا ﺷﻮد و ﺑﺘﻮاﻧﺪ ﺑﺮاي ﺗﺴﺖ ﻫﺎي ورودي ﺧﺮوﺟﻲ ﺻﺤﻴﺢ اﻳﺠﺎد‬
‫ﻛﻨﺪ‪.‬‬
‫‪4‬‬
‫ﻛﺪ ﻣﻨﺒﻊ ﭘﺮوژه ﺧﻮدﺗﺎن را ﺑﻪ ﻫﻤـﺮاه ﻣـﺴﺘﻨﺪات ﻣﺮﺑـﻮط ﺑـﻪ آن را در ﻏﺎﻟـﺐ ﻳـﻚ ﻓﺎﻳـﻞ ﻓـﺸﺮده ﺑـﻪ ﻧـﺎم‬
‫‪ interpolation‬ﺗﺎ زﻣﺎن ﺗﺤﻮﻳﻞ ﺑﻪ آدرس ‪ [email protected]‬ارﺳﺎل ﻧﻤﺎﻳﻴﺪ‪ .‬ﻓﻴﻠﺪ ‪ subject‬ﻧﺎﻣﻪ‬
‫ﺧﻮد را ﺑﺮاﺑﺮ ﺑﺎ )‪ Project2-interpolation-(8510xxxx-8510xxxx‬ﻗﺮار دﻫﻴﺪ ﻛـﻪ در آن ‪ xxxx‬ﭼﻬـﺎر‬
‫رﻗﻢ اﻧﺘﻬﺎﻳﻲ ﺷﻤﺎره داﻧﺸﺠﻮﻳﻲ اﻋﻀﺎي ﺗﻴﻢ ﺷﻤﺎ ﻣﻲ ﺑﺎﺷﺪ‪.‬‬
‫ﻣﻮﻓﻖ ﺑﺎﺷﻴﺪ‪.‬‬
‫‪ 3‬ﺑﺮاي اﻳﻦ ﻛﺎر از ‪ header file‬ﻫﺎي ‪)stdio.h‬ﺑﺮاي زﺑﺎن ‪ (C‬و ﻓﺎﻳﻞ ‪ ) iostream‬ﺑﺮاي زﺑﺎن ‪ (C++‬اﺳﺘﻔﺎده ﻛﻨﻴﺪ‪.‬‬
‫‪ 4‬ﺑﺎ ﻓﺮﻣﺖ ‪ rar ،zip‬ﻳﺎ ‪tar‬‬