Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package lab2;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- /**
- *
- * @author Alexander Slapoguzov
- */
- interface IFunctions
- {
- public double functions(double x);
- }
- class Func1 implements IFunctions
- {
- public double functions(double x)
- {
- return (x*x)/2;
- }
- }
- class Func2 implements IFunctions
- {
- public double functions(double x)
- {
- return 5*Math.log(x)+(x*x);
- }
- }
- class Func3 implements IFunctions
- {
- public double functions(double x)
- {
- return 1/x+7*x+3;
- }
- }
- class Func4 implements IFunctions
- {
- public double functions(double x)
- {
- return Math.pow(7, x)+1/x;
- }
- }
- class IntegrationTrap
- {
- private IFunctions func;
- public int n; //кол-во итераций
- public double err; //погрешность
- private double e; //точноcть
- private double a; //верхний предел интегрирования
- private double b; //нижний предел интегрирования
- /**
- *
- * @param sender -- интегрируемая функция
- * @param e_ -- точность
- * @param a_ -- верхний предел интегрирования
- * @param b_ -- нижний предел интегрирования
- */
- public IntegrationTrap(IFunctions sender, double e_, double a_, double b_)
- {
- this.func = sender;
- this.e = Math.abs(e_);
- if(a_ < b_)
- {
- this.a = a_;
- this.b = b_;
- } else { throw new IllegalArgumentException("Верхний предел должен быть больше нижнего!"); }
- }
- /**
- *
- * @return -- значение интеграла
- */
- public double integrate()
- {
- double prev; //для хранения предыдущего значения
- double sum = 0;
- this.n = 1;
- double h; //высота трапеции или шаг разбиения
- do
- {
- prev = sum;
- h = (this.b - this.a) / n;
- sum = ((this.func.functions(this.a)+this.func.functions(this.b))/2)*h;
- for(int i=1; i<n; i++)
- {
- sum += (h * this.func.functions(a+i*h));
- }
- n *= 2;
- } while( runge(sum, prev) > this.e);
- n /= 2; //восстанавливаем значение
- return sum;
- }
- /**
- * Метод возвращает погрешность для метода трапеций по правилу Рунге
- *
- * @param a -- значение интеграла при числе шагов 2n
- * @param b -- значение интеграла при числе шагов n
- * @return -- погрешность
- */
- private double runge(double a, double b)
- {
- this.err = (Math.abs(a-b))/3;
- return err;
- }
- }
- public class Lab2 {
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) throws IOException {
- IFunctions Func;
- BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
- boolean flagMenu;
- byte selectedPointMenu;
- do
- {
- flagMenu = true;
- System.out.println("1. (x^2)/2");
- System.out.println("2. 5*ln(x)+(x*x)");
- System.out.println("3. 1/x+7*x+3");
- System.out.println("4. 7^x+1/x");
- System.out.println("5. Выход");
- System.out.print("Выберите интегрируемую функцию: ");
- try
- {
- selectedPointMenu = Byte.parseByte(stdin.readLine());
- switch(selectedPointMenu) {
- case 1:
- Func = new Func1();
- flagMenu = subMenu(Func);
- break;
- case 2:
- Func = new Func2();
- flagMenu = subMenu(Func);
- break;
- case 3:
- Func = new Func3();
- flagMenu = subMenu(Func);
- break;
- case 4:
- Func = new Func4();
- flagMenu = subMenu(Func);
- break;
- case 5:
- flagMenu = false;
- break;
- default:
- System.out.println("Некорректный ввод! Повторите попытку");
- }
- }
- catch(NumberFormatException e)
- {
- System.out.println("Ошибка: " + e.getMessage());
- System.out.print("Для завершения работы нажмите q, а для продолжения любой другой символ: ");
- String ch = stdin.readLine();
- if("q".equals(ch)) { flagMenu=false; }
- else flagMenu = true;
- }
- }while(flagMenu);
- }
- private static boolean subMenu(IFunctions Func) throws IOException
- {
- BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
- try
- {
- IntegrationTrap MyIntegral;
- System.out.print("Введите точность: ");
- double e = Double.parseDouble(stdin.readLine());
- System.out.print("Введите нижний предел интегрирования: ");
- double a = Double.parseDouble(stdin.readLine());
- System.out.print("Введите верхний предел интегрирования: ");
- double b = Double.parseDouble(stdin.readLine());
- MyIntegral = new IntegrationTrap(Func, e, a, b);
- System.out.println("Значение интеграла: " + MyIntegral.integrate());
- System.out.println("Погрешность: " + MyIntegral.err);
- System.out.println("Количество разбиений: " + MyIntegral.n);
- System.out.print("Для завершения работы нажмите q, а для продолжения любой другой символ: ");
- String ch = stdin.readLine();
- if("q".equals(ch)) { return false; }
- else return true;
- }
- catch(IllegalArgumentException e)
- {
- System.out.println("Ошибка: " + e.getMessage());
- System.out.print("Для завершения работы нажмите q, а для продолжения любой другой символ: ");
- String ch = stdin.readLine();
- if("q".equals(ch)) { return false; }
- else return true;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement