Advertisement
Slapoguzov

ВычМат_Лаб2

Oct 4th, 2014
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.10 KB | None | 0 0
  1. package lab2;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6.  
  7. /**
  8.  *
  9.  * @author Alexander Slapoguzov
  10.  */
  11.  
  12. interface IFunctions
  13. {
  14.     public double functions(double x);
  15. }
  16.  
  17. class Func1 implements IFunctions
  18. {
  19.     public double functions(double x)
  20.     {
  21.         return (x*x)/2;
  22.     }
  23. }
  24.  
  25. class Func2 implements IFunctions
  26. {
  27.     public double functions(double x)
  28.     {
  29.         return 5*Math.log(x)+(x*x);
  30.     }
  31. }
  32.  
  33. class Func3 implements IFunctions
  34. {
  35.     public double functions(double x)
  36.     {
  37.         return 1/x+7*x+3;
  38.     }
  39. }
  40. class Func4 implements IFunctions
  41. {
  42.     public double functions(double x)
  43.     {
  44.         return Math.pow(7, x)+1/x;
  45.     }
  46. }
  47.  
  48. class IntegrationTrap
  49. {
  50.     private IFunctions func;
  51.     public int n;               //кол-во итераций
  52.     public double err;          //погрешность
  53.     private double e;           //точноcть
  54.     private double a;           //верхний предел интегрирования
  55.     private double b;           //нижний предел интегрирования
  56.    
  57.     /**
  58.      *
  59.      * @param sender -- интегрируемая функция
  60.      * @param e_     -- точность
  61.      * @param a_     -- верхний предел интегрирования
  62.      * @param b_     -- нижний предел интегрирования
  63.      */
  64.     public IntegrationTrap(IFunctions sender, double e_, double a_, double b_)
  65.     {
  66.         this.func = sender;
  67.         this.e = Math.abs(e_);
  68.         if(a_ < b_)
  69.         {
  70.             this.a = a_;
  71.             this.b = b_;
  72.         } else { throw new IllegalArgumentException("Верхний предел должен быть больше нижнего!"); }
  73.     }
  74.    
  75.     /**
  76.      *
  77.      * @return  -- значение интеграла
  78.      */
  79.     public double integrate()
  80.     {
  81.         double prev;            //для хранения предыдущего значения
  82.         double sum = 0;
  83.         this.n = 1;
  84.         double h;                   //высота трапеции или шаг разбиения
  85.         do
  86.         {
  87.             prev = sum;
  88.             h = (this.b - this.a) / n;
  89.             sum = ((this.func.functions(this.a)+this.func.functions(this.b))/2)*h;
  90.             for(int i=1; i<n; i++)
  91.             {
  92.                 sum += (h * this.func.functions(a+i*h));
  93.             }
  94.             n *= 2;  
  95.            
  96.         } while( runge(sum, prev) > this.e);
  97.        
  98.         n /= 2;                     //восстанавливаем значение
  99.         return sum;
  100.  
  101.     }
  102.    
  103.     /**
  104.      * Метод возвращает погрешность для метода трапеций по правилу Рунге
  105.      *
  106.      * @param a --  значение интеграла при числе шагов 2n
  107.      * @param b --  значение интеграла при числе шагов n
  108.      * @return  -- погрешность
  109.      */
  110.     private double runge(double a, double b)
  111.     {
  112.         this.err = (Math.abs(a-b))/3;
  113.         return err;
  114.     }
  115. }
  116.  
  117.  
  118. public class Lab2 {
  119.  
  120.     /**
  121.      * @param args the command line arguments
  122.      */
  123.     public static void main(String[] args) throws IOException {
  124.        
  125.         IFunctions Func;
  126.            
  127.         BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
  128.        
  129.         boolean flagMenu;
  130.         byte selectedPointMenu;
  131.         do
  132.         {
  133.             flagMenu = true;
  134.            
  135.             System.out.println("1. (x^2)/2");
  136.             System.out.println("2. 5*ln(x)+(x*x)");
  137.             System.out.println("3. 1/x+7*x+3");
  138.             System.out.println("4. 7^x+1/x");
  139.             System.out.println("5. Выход");
  140.             System.out.print("Выберите интегрируемую функцию: ");
  141.            
  142.             try
  143.             {
  144.             selectedPointMenu = Byte.parseByte(stdin.readLine());
  145.            
  146.            
  147.             switch(selectedPointMenu) {
  148.                 case 1:
  149.                     Func = new Func1();
  150.                     flagMenu = subMenu(Func);
  151.                     break;
  152.                 case 2:
  153.                     Func = new Func2();
  154.                     flagMenu = subMenu(Func);
  155.                     break;
  156.                 case 3:
  157.                     Func = new Func3();
  158.                     flagMenu = subMenu(Func);
  159.                     break;
  160.                 case 4:
  161.                     Func = new Func4();
  162.                     flagMenu = subMenu(Func);
  163.                     break;
  164.                 case 5:
  165.                     flagMenu = false;
  166.                     break;
  167.                 default:
  168.                     System.out.println("Некорректный ввод! Повторите попытку");
  169.             }
  170.             }
  171.             catch(NumberFormatException e)
  172.             {
  173.                 System.out.println("Ошибка: " + e.getMessage());
  174.                 System.out.print("Для завершения работы нажмите q, а для продолжения любой другой символ: ");
  175.                 String ch = stdin.readLine();
  176.                 if("q".equals(ch)) { flagMenu=false; }
  177.                 else flagMenu = true;
  178.             }
  179.                  
  180.         }while(flagMenu);
  181.        
  182.     }
  183.    
  184.     private static boolean subMenu(IFunctions Func) throws IOException
  185.     {
  186.         BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
  187.         try
  188.         {
  189.         IntegrationTrap MyIntegral;
  190.         System.out.print("Введите точность: ");
  191.         double e = Double.parseDouble(stdin.readLine());
  192.  
  193.         System.out.print("Введите нижний предел интегрирования: ");
  194.         double a = Double.parseDouble(stdin.readLine());
  195.         System.out.print("Введите верхний предел интегрирования: ");
  196.         double b = Double.parseDouble(stdin.readLine());
  197.            
  198.         MyIntegral = new  IntegrationTrap(Func, e, a, b);
  199.        
  200.         System.out.println("Значение интеграла: " + MyIntegral.integrate());
  201.         System.out.println("Погрешность: " + MyIntegral.err);
  202.         System.out.println("Количество разбиений: " + MyIntegral.n);
  203.            
  204.         System.out.print("Для завершения работы нажмите q, а для продолжения любой другой символ: ");
  205.         String ch = stdin.readLine();
  206.         if("q".equals(ch)) { return false; }
  207.         else return true;
  208.         }
  209.         catch(IllegalArgumentException e)
  210.         {
  211.             System.out.println("Ошибка: " + e.getMessage());
  212.             System.out.print("Для завершения работы нажмите q, а для продолжения любой другой символ: ");
  213.             String ch = stdin.readLine();
  214.             if("q".equals(ch)) { return false; }
  215.             else return true;
  216.         }
  217.     }
  218.    
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement