Advertisement
tsounakis

Numerical Analysis 2

Dec 18th, 2021
1,056
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.46 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. double k, r_a, z_a, phi_a, R, Q;
  7.  
  8. double EZ(double integral);
  9. double EPolar(double integral);
  10. double integralZ(double phi);
  11. double integralPolar(double phi);
  12. double trapezoid(double a, double b, double n, double (*func)(double));
  13. double simpson(double a, double b, double n, double (*func)(double));
  14. void results(double, double, double (*field)(double), double (*integral)(double), double (*method)(double,  double,  double,  double (*)(double)));
  15.  
  16. int main(){
  17.     k = 9 * pow(10, 9);
  18.     Q = pow(10, -6);
  19.     r_a = 0.1;
  20.     z_a = 0.4;
  21.     R = 0.05;
  22.     phi_a = 35;
  23.  
  24.     double (*E[2])(double) = {EZ, EPolar};
  25.     double (*I[2])(double) = {integralZ, integralPolar};
  26.     double (*trap)(double, double, double, double (*)(double)) = trapezoid;
  27.     double (*simp)(double, double, double, double (*)(double)) = simpson;
  28.  
  29.     for (int problem = 0; problem < 2; problem++){
  30.         if (problem == 0){
  31.             printf("Ερώτημα 1:\Καρτεσιανή συνιστώσα της έντασης ηλεκτρικού πεδίου.\n");
  32.         } else{
  33.             printf("Ερώτημα 2:\tΠολική συνιστώσα της έντασης ηλεκτρικού πεδίου.\n");
  34.         }
  35.         printf("Υπολογισμός έντασης πεδίου με τη μέθοδο του τραπεζίου.\n");
  36.         results(0, 2*M_PI, *E[problem], *I[problem], *trap);
  37.         printf("Υπολογισμός έντασης πεδίου με τη μέθοδο του Simpson.\n");
  38.         results(0, 2*M_PI, *E[problem], *I[problem], *simp);
  39.     }
  40.  
  41.         printf("All ok.");
  42.     return 0;
  43. }
  44.  
  45.  
  46. double EZ(double integral){
  47.     return k * Q * z_a * integral / (2 * M_PI);
  48. }
  49.  
  50. double integralZ(double phi){
  51.     double a = sqrt(pow(r_a, 2) + pow(R, 2) + pow(z_a, 2));
  52.     return (1 / pow((pow(a, 2) - 2 * r_a * R * cos(phi - phi_a)), 1.5));
  53. }
  54.  
  55. double EPolar(double integral){
  56.     return k * Q * integral / (2 * M_PI);
  57. }
  58.  
  59. double integralPolar(double phi){
  60.     double a = sqrt(pow(r_a, 2) + pow(R, 2) + pow(z_a, 2));
  61.     return (sqrt(pow(r_a, 2) + pow(R, 2) - 2 * r_a * R * cos(phi - phi_a)) / pow((pow(a, 2) - 2 * r_a * R * cos(phi - phi_a)), 1.5));
  62. }
  63.  
  64. double trapezoid(double a, double b, double n, double (*func)(double)){
  65.     double h, s, x_i;
  66.     h = (b - a) / n;
  67.     s = 0.0;
  68.     for (int i=0; i<=n; i++){
  69.         x_i = a + i * h;
  70.         if (i ==0 || i==n){
  71.             s += func(x_i)/2;
  72.         } else{
  73.             s += func(x_i);
  74.         }
  75.     }
  76.     return s*h;
  77. }
  78.  
  79. double simpson(double a, double b, double n, double (*func)(double)){
  80.     double h, s, x_0, x_i, x_n;
  81.     h = (b - a) / n;
  82.     s = 0.0;
  83.     for (int i=0; i<=n; i++){
  84.         x_i = a + i * h;
  85.         if (i==0 || i==n){
  86.             s += func(x_i);
  87.         } else if (i%2==0){
  88.             s += 2*func(x_i);
  89.         } else{
  90.             s += 4*func(x_i);
  91.         }
  92.     }
  93.     return h*s/3;
  94. }
  95.  
  96. void results(double a, double b, double (*field)(double), double (*integral)(double), double (*method)(double,  double,  double,  double (*)(double))){
  97.     double integral_0, integral_1, error = 1.0;
  98.     int n = 2;
  99.     for (int i = 0; error >= 0.5*pow(10,-8); i++){
  100.         integral_0 = method(a, b, n, integral);
  101.         integral_1 = method(a, b, n *= 2, integral);
  102.         error = fabs(integral_0 - integral_1);        
  103.     }
  104.     printf("FIELD: %.8f kNC^-1\n", field(integral_0)/1000);
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement