Advertisement
Guest User

Untitled

a guest
Feb 25th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.08 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <complex.h>
  3.  
  4. double _Complex f1(double _Complex x) {
  5. return (x - 1)*(x + 1)*(x + _Complex_I)*(x - _Complex_I);
  6. }
  7.  
  8. double _Complex f(double _Complex x) {
  9. return csin(x) / x;
  10. }
  11.  
  12. double _Complex fWrap(double _Complex (*f)(double _Complex), double _Complex roots[], int num, double _Complex x) {
  13. double _Complex res = f(x);
  14. for (int i = 0; i < num; i++) {
  15. res /= (x - roots[i]);
  16. }
  17. return res;
  18. }
  19.  
  20. int Muller(double _Complex (*f)(double _Complex), double _Complex x0, double _Complex x1, double _Complex x2, int maxIter, double argPrecision, double funcPrecision, double _Complex *res) {
  21. double _Complex h1 = x1 - x0;
  22. double _Complex h2 = x2 - x1;
  23. double _Complex delta1 = (f(x1) - f(x0))/h1;
  24. double _Complex delta2 = (f(x2) - f(x1))/h2;
  25. double _Complex d = (delta2 - delta1)/(h1 + h2);
  26. double _Complex E, b, D, h, p;
  27. int i = 2;
  28.  
  29. while (i < maxIter) {
  30. //printf("%f, %f, %f\n", creal(x0), creal(x1), creal(x2));
  31. //printf("%f, %f, %f\n", cimag(x0), cimag(x1), cimag(x2));
  32. if (cabs(x2 - x1) < argPrecision || cabs(f(x2)) <= funcPrecision) {
  33. *res = x2;
  34. return i;
  35. }
  36.  
  37. b = delta2 + (h2 * d);
  38. D = csqrt(b * b - 4 * f(x2) * d);
  39.  
  40. if (cabs(b - D) < cabs(b + d)) {
  41. E = b + D;
  42. } else {
  43. E = b - D;
  44. }
  45.  
  46. h = -2 * f(x2) / E;
  47. p = x2 + h;
  48.  
  49. x0 = x1;
  50. x1 = x2;
  51. x2 = p;
  52.  
  53. h1 = x1 - x0;
  54. h2 = x2 - x1;
  55. delta1 = (f(x1) - f(x0))/h1;
  56. delta2 = (f(x2) - f(x1))/h2;
  57. d = (delta2 - delta1)/(h1 + h2);
  58. i++;
  59. }
  60.  
  61. return -1;
  62. }
  63.  
  64. int MullerFunc(double _Complex (*f)(double _Complex), double _Complex x0, double _Complex x1, int rootNum, int maxIter, double argPrecision, double funcPrecision, double _Complex res[]) {
  65. int founded = 0;
  66. int lastres = 1;
  67. while (founded < rootNum && lastres > 0) {
  68. double _Complex x2 = (x0 + x1) / 2.0;
  69. double _Complex h1 = x1 - x0;
  70. double _Complex h2 = x2 - x1;
  71. double _Complex delta1 = (fWrap(f, res, founded, x1) - fWrap(f, res, founded, x0))/h1;
  72. double _Complex delta2 = (fWrap(f, res, founded, x2) - fWrap(f, res, founded, x1))/h2;
  73. double _Complex d = (delta2 - delta1)/(h1 + h2);
  74. double _Complex E, b, D, h, p;
  75. int i = 2;
  76.  
  77. while (i < maxIter) {
  78. //printf("%f, %f, %f\n", creal(x0), creal(x1), creal(x2));
  79. //printf("%f, %f, %f\n", cimag(x0), cimag(x1), cimag(x2));
  80. if (cabs(x2 - x1) < argPrecision || cabs(fWrap(f, res, founded, x2)) <= funcPrecision) {
  81. res[founded] = x2;
  82. founded++;
  83. lastres = i;
  84. break;
  85. }
  86.  
  87. b = delta2 + (h2 * d);
  88. D = csqrt(b * b - 4 * f(x2) * d);
  89.  
  90. if (cabs(b - D) < cabs(b + d)) {
  91. E = b + D;
  92. } else {
  93. E = b - D;
  94. }
  95.  
  96. h = -2 * fWrap(f, res, founded, x2) / E;
  97. p = x2 + h;
  98.  
  99. x0 = x1;
  100. x1 = x2;
  101. x2 = p;
  102.  
  103. h1 = x1 - x0;
  104. h2 = x2 - x1;
  105. delta1 = (fWrap(f, res, founded, x1) - fWrap(f, res, founded, x0))/h1;
  106. delta2 = (fWrap(f, res, founded, x2) - fWrap(f, res, founded, x1))/h2;
  107. d = (delta2 - delta1)/(h1 + h2);
  108. i++;
  109. }
  110.  
  111. if (i == maxIter) lastres = -1;
  112. }
  113.  
  114. return founded;
  115. }
  116.  
  117. int main() {
  118.  
  119. double _Complex x0 = -1.0 + 0.0 * _Complex_I;
  120. double _Complex x1 = 2.0 + 0.0 * _Complex_I;
  121. double _Complex x2 = 2.0 + 0.0 * _Complex_I;
  122.  
  123. double _Complex res[10];
  124.  
  125. //printf("%f\n", f(x2));
  126.  
  127. //printf("%d\n", Muller(f, x0, x1, x2, 50, 0.005, 0.005, &res));
  128. int num = MullerFunc(f1, x0, x1, 8, 500, 0.005, 0.005, res);
  129. for (int i = 0; i < num; i++) {
  130. printf("real: %f\tim: %f\n", creal(res[i]), cimag(res[i]));
  131. }
  132. //printf("%f\n", creal(res));
  133.  
  134.  
  135. return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement