Guest User

Untitled

a guest
Jun 20th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.10 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<stdlib.h>
  4. #define DEBUG(str) //printf(str)
  5. typedef struct
  6. {
  7. int order;
  8. float *coeff;
  9. }poly;
  10.  
  11. void print(poly a)
  12. {
  13. int i;
  14. int no_output = 1;
  15. for(i = a.order; i >= 0; i--)
  16. {
  17. if(a.coeff[i] == 0)
  18. continue;
  19. printf("%+.2fx^%d", a.coeff[i], i);
  20. no_output = 0;
  21. }
  22. if(no_output)
  23. {
  24. printf("0");
  25. }
  26. printf("\n");
  27. }
  28.  
  29. poly clone(poly a)
  30. {
  31. poly c;
  32. int i, n;
  33. c.order = a.order;
  34. for(i = 0; i <= c.order; i++ )
  35. {
  36. c.coeff[i] = a.coeff[i];
  37. }
  38. DEBUG("Clone");
  39. return c;
  40. }
  41. poly multiply(poly a, poly b)
  42. {
  43. poly res;
  44. int i, j, n, o1 = a.order, o2 = b.order;
  45. res.order = o1 + o2;
  46. res.coeff = (float *)malloc(sizeof(float) * (res.order + 1));
  47. for(i = 0; i <= res.order; i++)
  48. res.coeff[i] = 0;
  49. for(i = 0; i <= o1; i++)
  50. for(j = 0; j <= o2; j++)
  51. res.coeff[i+j] += a.coeff[i] * b.coeff[j];
  52. DEBUG("Multiply");
  53. return res;
  54. }
  55.  
  56. poly add(poly a, poly b)
  57. {
  58. int i, o1 = a.order, o2 = b.order;
  59. poly res;
  60. res.order = (o1>o2)?o1:o2;
  61. res.coeff = (float *)malloc(sizeof(float) * (res.order + 1));
  62. for(i = 0; i <= o1 && i <= o2; i++)
  63. {
  64. res.coeff[i] = a.coeff[i] + b.coeff[i];
  65. }
  66. while(i <= o1)
  67. {
  68. res.coeff[i] = a.coeff[i];
  69. i++;
  70. }
  71. while(i <= o2)
  72. {
  73. res.coeff[i] = b.coeff[i];
  74. i++;
  75. }
  76. res.order = i-1;
  77. DEBUG("Add");
  78. return res;
  79. }
  80.  
  81. poly subtract(poly a, poly b)
  82. {
  83. int i, o1 = a.order, o2 = b.order;
  84. poly res;
  85. res.order = (o1>o2)?o1:o2;
  86. res.coeff = (float *)malloc(sizeof(float) * (res.order + 1));
  87. for(i = 0; i <= o1 && i <= o2; i++)
  88. {
  89. res.coeff[i] = a.coeff[i] - b.coeff[i];
  90. }
  91. while(i <= o1)
  92. {
  93. res.coeff[i] = a.coeff[i];
  94. i++;
  95. }
  96. while(i <= o2)
  97. {
  98. res.coeff[i] = - b.coeff[i];
  99. i++;
  100. }
  101. res.order = i-1;
  102. DEBUG("Subtract");
  103. return res;
  104. }
  105.  
  106. poly generate_node_x()
  107. {
  108. poly new_node;
  109. new_node.order = 1;
  110. new_node.coeff = (float *)malloc(sizeof(float)*2);
  111. new_node.coeff[0] = 0;
  112. new_node.coeff[1] = 1;
  113. DEBUG("NewNode");
  114. return new_node;
  115. }
  116.  
  117. #define AND(a,b) multiply(a,b)
  118. #define OR(a,b) add(a,subtract(b,multiply(a,b)))
  119.  
  120. double f(poly p, double x)
  121. {
  122. int i;
  123. double res = 0;
  124. if(x == 0)
  125. return p.coeff[0];
  126. for(i = p.order; i > 0; i--)
  127. {
  128. res += p.coeff[i];
  129. res *= x;
  130. }
  131. res += p.coeff[0];
  132. return res;
  133. }
  134.  
  135. double FalsiMethod(poly p, double s, double t, double e, int m)
  136. {
  137. int n, side = 0;
  138. double r, fr, fs = f(p, s), ft = f(p, t);
  139. for(n = 1; n <= m; n++)
  140. {
  141. r = (fs*t - ft*s) / (fs - ft);
  142. if (fabs(t-s) < e*fabs(t+s)) break;
  143. fr = f(p, r);
  144.  
  145. if (fr * ft > 0)
  146. {
  147. t = r; ft = fr;
  148. if (side==-1) fs /= 2;
  149. side = -1;
  150. }
  151. else if (fs * fr > 0)
  152. {
  153. s = r; fs = fr;
  154. if (side==+1) ft /= 2;
  155. side = +1;
  156. }
  157. else break;
  158. }
  159. return r;
  160. }
  161.  
  162. double SecantMethod(poly p, double xn_1, double xn, double e, int m)
  163. {
  164. int n;
  165. double d;
  166. for (n = 1; n <= m; n++)
  167. {
  168. d = (xn - xn_1) / (f(p, xn) - f(p, xn_1)) * f(p, xn);
  169. if (fabs(d) < e)
  170. return xn;
  171. xn_1 = xn;
  172. xn = xn - d;
  173. }
  174. return xn;
  175. }
  176.  
  177. int main()
  178. {
  179. int t, n, i, x, y, z;
  180. //int done=0, fixedpos;
  181. poly node[100], ex;
  182. scanf("%d", &t);
  183. while(t--)
  184. {
  185. scanf("%d", &n);
  186. for(i = 1; i <= n; i++)
  187. {
  188. scanf("%d", &x);
  189. switch(x)
  190. {
  191. case 0:
  192. node[i] = generate_node_x();
  193. break;
  194. case 1:
  195. scanf("%d %d", &y, &z);
  196. node[i] = OR(node[y], node[z]);
  197. break;
  198. case 2:
  199. scanf("%d %d", &y, &z);
  200. node[i] = AND(node[y], node[z]);
  201. break;
  202. }
  203. }
  204. ex = node[i-1];
  205. ex.coeff[0] -= 0.5;
  206. /*
  207. fixedpos = (f(ex,0) > 0);
  208. t = 1;
  209. while(!done)
  210. {
  211. t = t/2;
  212. if(fixedpos && f(t) < 0)
  213. }
  214. */
  215. printf("%.5f\n", SecantMethod(ex, 0, 1, 5E-6, 100));
  216. }
  217. return 0;
  218. }
Add Comment
Please, Sign In to add comment