Advertisement
Guest User

Untitled

a guest
May 20th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.74 KB | None | 0 0
  1. #include "stdio.h"
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. #define MAXN 101
  7. // MAXN - rozmiar tablic węzłów i wartości funkcji w węzłach interpolacji
  8. // zakładamy, że n<MAXN
  9. int n; // maksymalny indeks węzła interpolacji, (n+1) - liczba węzłów
  10. int mn; // liczba pośrednich punktów między węzłami interpolacji w drugim pliku
  11. int opt; // opt=0 - węzły równoodległe, opt=1 - węzły dobrane optymalnie
  12. int init=0;
  13. double a, b; //granice przedziału
  14. double x[MAXN]; //tablica węzłów
  15. double f[MAXN]; //tablica wartości funkcji w węzłach interpolacji
  16. char *plkNazwaWezly, *plkNazwa; //nazwy pierwszego i drugiego pliku
  17. // inne tabele i zmienne
  18.  
  19. double aa[MAXN];
  20. double bb[MAXN];
  21. double cc[MAXN];
  22. double dd[MAXN];
  23.  
  24.  
  25.  
  26.  
  27. void solveMatrix(double pa[], double pb[], double pc[], double pd[], double xsol[], int n);
  28. // funkcja na podstawie której wyznaczane są wartości w węzłach interpolacji
  29.  
  30.  
  31.  
  32.  
  33.  
  34. double fun(double t)
  35. {
  36.  
  37. return 0.5 + fabs(t*t - t);
  38. }
  39.  
  40.  
  41.  
  42. void ABCD()
  43. {
  44. double uu[MAXN];
  45. double ww[MAXN];
  46. double vv[MAXN];
  47. double p2[MAXN];
  48. double hh[MAXN];
  49. for(int i = 0;i<=n;i++) p2[i] = 2;
  50.  
  51.  
  52. for(int i = 0 ;i<=n-1;i++)
  53. {
  54. hh[i] = x[i+1] - x[i];
  55. }
  56.  
  57. for(int i = 0 ;i<n-1;i++)
  58. {
  59. uu[i+1] = (hh[i])/(hh[i] + hh[i+1]);
  60. ww[i+1] = (hh[i+1])/(hh[i] + hh[i+1]);
  61. vv[i+1] = ((f[i+2] - f[i+1])/(hh[i+1])-((f[i+1] - f[i])/(hh[i])))/(hh[i] + hh[i+1]);
  62. }
  63.  
  64. solveMatrix(uu, p2, ww, vv, cc, n-1);
  65. cc[0] = cc[n] = 0;
  66. for(int i = 1;i<=n-1;i++)
  67. {
  68. cc[i] = 3*cc[i];
  69. }
  70. for(int i = 0;i<=n-1;i++)
  71. {
  72. aa[i] = f[i];
  73. bb[i] = ((f[i+1]-f[i]) / hh[i]) - ((hh[i]/3)*(cc[i+1] + 2*cc[i]));
  74. dd[i] = (cc[i+1] - cc[i])/(3*hh[i]);
  75. }
  76.  
  77. }
  78.  
  79. void solveMatrix(double pa[], double pb[], double pc[], double pd[], double xsol[], int n)
  80. {
  81. double alfa[MAXN];
  82. double beta[MAXN];
  83.  
  84. alfa[1] = - pc[1]/pb[1];
  85. beta[1] = pd[1]/ pb[1];
  86. for(int i =2; i<=n;i++)
  87. {
  88. alfa[i] = - pc[i]/(pb[i] + pa[i]*alfa[i-1]);
  89. beta[i] = (pd[i] - pa[i]*beta[i-1])/(pb[i] + pa[i]*alfa[i-1]);
  90. }
  91.  
  92. xsol[n] = beta[n];
  93. for(int i = n-1; i>=1; i--)
  94. {
  95. xsol[i] = alfa[i]*xsol[i+1] + beta[i];
  96. }
  97. }
  98.  
  99. // funkcja interpolująca
  100. double inter(double t)
  101. {
  102.  
  103. int j=n-1;
  104. for(int i=0;i<=n-1;i++)
  105. {
  106. if(t<x[i+1])
  107. {
  108. j=i;
  109. break;
  110. }
  111. }
  112. double delta=t-x[j];
  113.  
  114.  
  115.  
  116. return aa[j] + delta*(bb[j] + delta*(cc[j] + delta*dd[j]));
  117. }
  118.  
  119. // Wyznaczenie węzłów interpolacji i wartości funkcji w węzłach
  120. void generWezly()
  121. {
  122. double delta;
  123. double pi=4*atan(1.0);
  124. if (opt==0)
  125. {
  126. // węzły równoodległe
  127. delta=(b-a)/n;
  128. for (int i=0; i<=n; i++)
  129. {
  130. x[i]=a+i*delta;
  131. f[i]=fun(x[i]);
  132. printf("%f %f \n", x[i], f[i]);
  133. }
  134. }
  135. else
  136. {
  137. // węzły optymalnie dobrane
  138. delta=(b-a)/2;
  139. for (int i=0; i<=n; i++)
  140. {
  141. x[i]=(a+b)/2 - delta*cos(pi*(2*i+1)/(2*n+2));
  142. f[i]=fun(x[i]);
  143. printf("%f %f \n", x[i], f[i]);
  144. }
  145. }
  146. }
  147.  
  148. // Wyprowadzenie danych do pierwszego pliku
  149. void generWezlyPlik()
  150. {
  151. FILE *plk;
  152. plk = fopen( plkNazwaWezly, "w" );
  153. // wydruk nagłówka dla pliku .rex
  154. fprintf(plk, "xi\t f_xi\n");
  155. // wydruk par węzeł i wartość funkcji w węźle interpolacji
  156. for (int i=0; i<=n; i++)
  157. {
  158. fprintf(plk, "%f\t %f\n", x[i], f[i]);
  159. }
  160. // wydruk stopki dla pliku .rex
  161. // fprintf(plk, "*InfKon*\nV 0 0 0 %d",n+1 );
  162. fclose(plk);
  163. }
  164.  
  165. //Wyprowadzenie wiersza do drugiego pliku
  166. void drukWiersz(double t, FILE *plk)
  167. {
  168. double eps=1.0e-20;
  169. double f, wyn;
  170. f=fun(t);
  171. wyn=inter(t);
  172. fprintf(plk, "%lf\t %lf\t %lf\t %lf\t %lf\n", t, f, wyn, f-wyn, (f-wyn)/(fabs(f)+eps));
  173.  
  174. }
  175.  
  176. // Wyprowadzenie danych do drugiego pliku
  177. void generWynikiPlik()
  178. {
  179. double delta;
  180. int i, j, lbwier;
  181. FILE *plk;
  182. plk = fopen( plkNazwa, "w" );
  183. // wydruk nagłówka dla pliku .rex
  184. fprintf(plk, "x\t f_x\t w_x\t blb_x\t blw_x\n");
  185. if (!(opt==0))
  186. {
  187. // dla węzłów optymalnie dobranych wydruk punktów pośrednich w przedziale <a, x[0])
  188. delta=(x[0]-a)/mn;
  189. for(j=0; j<mn; j++)
  190. {
  191. drukWiersz(a+delta*j, plk);
  192. }
  193. }
  194. // wydruk punktów w przedziale <x[0], x[n])
  195. for (i=0; i<n; i++)
  196. {
  197. delta=(x[i+1]-x[i])/mn;
  198. for(j=0; j<mn; j++)
  199. {
  200. drukWiersz(x[i]+delta*j, plk);
  201. }
  202. }
  203. if (!(opt==0))
  204. {
  205. // dla węzłów optymalnie dobranych wydruk punktów pośrednich w przedziale <x[n], b)
  206. delta=(b-x[n])/mn;
  207. for(j=0; j<mn; j++)
  208. {
  209. drukWiersz(x[n]+delta*j, plk);
  210. };
  211. lbwier=(n+2)*mn+1;
  212. }
  213. else
  214. lbwier=n*mn+1;
  215. // wydruk wydruk wartości dla x=b
  216. drukWiersz(b, plk);
  217. // wydruk stopki dla pliku .rex
  218. // fprintf(plk, "*InfKon*\nV 0 0 0 %d", lbwier);
  219. fclose(plk);
  220. }
  221.  
  222.  
  223. int main(int argc, char* argv[])
  224. {
  225. // Odczyt danych z linii polecenia
  226. a=atof(argv[1]); //lewa granica przedziału
  227. b=atof(argv[2]); //prawa granica przedziału
  228. n=atoi(argv[3]); //maksymalny indeks węzła interpolacji
  229. mn=atoi(argv[4]); //liczba pośrednich punktów między węzłami interpolacji w drugim pliku
  230. opt=atoi(argv[5]); // opt=0 - węzły równoodległe, opt=1 - węzły dobrane optymalnie
  231. plkNazwa=argv[6]; //nazwa drugiego pliku (pliku z wynikami działania funkcji interpolującej)
  232. plkNazwaWezly=argv[7]; //nazwa pierwszego pliku (pliku z węzłami)
  233. // Wyprowadzenie na ekran danych z linii polecenia
  234. printf("a= %f\n", a);
  235. printf("b= %f\n", b);
  236. printf("n= %d\n", n);
  237. printf("mn= %d\n", mn);
  238. printf("opt= %d\n", opt);
  239. // Wyznaczenie węzłów interpolacji i wartości funkcji w węzłach
  240. generWezly();
  241. // Wyprowadzenie danych do pierwszego pliku
  242. generWezlyPlik();
  243. //Wywołania funkcji generujących parammetry pomocnicze
  244.  
  245.  
  246.  
  247. ABCD();
  248.  
  249.  
  250.  
  251.  
  252. // Wyprowadzenie danych do drugiego pliku
  253. generWynikiPlik();
  254.  
  255.  
  256.  
  257. printf("..............................................");
  258. return 0;
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement