aLT22

CHM3Lab

Dec 18th, 2015
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.59 KB | None | 0 0
  1. /*Class Spline*/
  2. package package1;
  3.  
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.NavigableMap;
  7.  
  8. /**
  9.  * Created by Alexey on 08.12.2015.
  10.  */
  11. public class Spline {
  12.  
  13.     private double a, b;    //начало, конец
  14.     private int N;  //кол-во узлов отрезка
  15.     private ArrayList<Double> nodes;    //узлы интерполяции
  16.     private ArrayList<Double> newNodes;     //узлы учащенной сетки
  17.     private ArrayList<Double> values;   //значения функции в узлах интерполяции
  18.     private ArrayList<Double> newValues;    //значения функции в учащенной сетке
  19.     private ArrayList<Double> splineCafsB;   //значения коэффициентов B кубического сплайна
  20.     private ArrayList<Double> splineCafsC;   //значения коэффициентов C кубического сплайна
  21.     private ArrayList<Double> splineCafsD;   //значения коэффициентов D кубического сплайна
  22.     private ArrayList<Double> alpha;    //прогоночные коэф-ты alpha и betta
  23.     private ArrayList<Double> betta;    //прогоночные коэф-ты alpha и betta
  24.  
  25.     /*
  26.     * Сеттеры значений a, b, N
  27.     * */
  28.     public void setA(int a) {
  29.         this.a = a;
  30.     }
  31.  
  32.     public void setB(int b) {
  33.         this.b = b;
  34.     }
  35.  
  36.     public void setN(int n) {
  37.         N = n;
  38.     }
  39.  
  40.     /*
  41.     * Геттеры значений a, b, N
  42.     * */
  43.     public double getA() {
  44.         return a;
  45.     }
  46.  
  47.     public double getB() {
  48.         return b;
  49.     }
  50.  
  51.     public double getN() {
  52.         return N;
  53.     }
  54.  
  55.     /*
  56.     * Деление отрезка на N частей
  57.     * */
  58.     public void parcing() {
  59.         nodes = new ArrayList<>();
  60.         for (int i = 0; i <= N; i++) {
  61.             double temp = (double) (a + (b - a) * i / N);
  62.             nodes.add(temp);
  63.         }
  64.     }
  65.  
  66.     /*
  67.     * Деление отрезка на N частей
  68.     * */
  69.     public void parcingNew(){
  70.         newNodes = new ArrayList<>();
  71.         for (int i = 0; i <= (10*N); i++) {
  72.             double temp = (double) (a + (b - a) * i / (10*N));
  73.             newNodes.add(temp);
  74.         }
  75.     }
  76.  
  77.     /*
  78.     * Вычисление значений функции на учащенной сетке
  79.     * */
  80.     public void calcValInNewNodes(){
  81.         newValues = new ArrayList<>();
  82.         for(Double temp : newNodes) {
  83.             newValues.add(func(temp));
  84.         }
  85.     }
  86.  
  87.     /*
  88.     * Исходная функция
  89.     * */
  90.     private double func(double x){
  91.         return Math.pow(x, 2) - 5;
  92.     }
  93.  
  94.     /*
  95.     * Вычисление значений в узлах интерполяции
  96.     * */
  97.     public void calcValuesInNodes(){
  98.         values = new ArrayList<>();
  99.         for(Double temp : nodes) {
  100.             values.add(func(temp));
  101.         }
  102.     }
  103.  
  104.     /*
  105.     * Вывод на экран таблицы узлов и значений функции в узлах
  106.     * */
  107.     public void getTable(){
  108.         for(int i = 0; i < nodes.size(); i++) {
  109.             System.out.printf("%-10.3f", nodes.get(i));
  110.             System.out.printf("%-10.3f", values.get(i));
  111.             System.out.println();
  112.         }
  113.         System.out.println("******************************");
  114.     }
  115.  
  116.     /*
  117.     * Вычисление прогоночных коэф. alpha и betta
  118.     * */
  119.     public void alphaAndBettaCalc(){
  120.         alpha = new ArrayList<>();
  121.         betta = new ArrayList<>();
  122.         alpha.add(0, (double) 0);
  123.         betta.add(0, (double) 0);
  124.         for (int i = 1; i < N - 1; i++) {
  125.             double hi = nodes.get(i) - nodes.get(i-1);
  126.             double hi1 = nodes.get(i+1) - nodes.get(i);
  127.             double A = hi;
  128.             double B = hi1;
  129.             double C = 2 * (hi + hi1);
  130.             double D = 6 * ((values.get(i+1) - values.get(i)) / hi1 - (values.get(i) - values.get(i-1)) / hi);
  131.             double temp = (A * alpha.get(i-1) + C);
  132.             alpha.add(-B / temp);
  133.             betta.add((D - A * betta.get(i-1)) / temp);
  134.         }
  135.     }
  136.  
  137.     /*
  138.     * Обратный ход, нахождение решения
  139.     * */
  140.     private void setSplineCafsC(){
  141.         splineCafsC = new ArrayList<>();
  142.         init(splineCafsC);
  143.         for (int i = N - 2; i > 0; i--){
  144.             splineCafsC.add(alpha.get(i) * splineCafsC.get(i+1) + betta.get(i));
  145.         }
  146.     }
  147.  
  148.     /*
  149.     * Заполняем B коэффициенты сплайнов
  150.     * */
  151.     public void setSplineCafsB(){
  152.         splineCafsB = new ArrayList<>();
  153.         init(splineCafsB);
  154.         for (int i = N - 1; i > 0; i--) {
  155.             double hi = nodes.get(i) - nodes.get(i-1);
  156.             splineCafsB.add(hi * (2.0 * splineCafsC.get(i) + splineCafsC.get(i-1) / 6.0 + (values.get(i) - values.get(i-1)) / hi));
  157.         }
  158.     }
  159.  
  160.     /*
  161.     * Заполняем D коэффициенты сплайнов
  162.     * */
  163.     public void setSplineCafsD(){
  164.         splineCafsD = new ArrayList<>();
  165.         init(splineCafsD);
  166.         for (int i = N - 1; i > 0; i--) {
  167.             double hi = nodes.get(i) - nodes.get(i-1);
  168.             splineCafsD.add((splineCafsC.get(i) - splineCafsC.get(i-1)) / hi);
  169.         }
  170.     }
  171.  
  172.     /*
  173.     * Вычисление интерполированной функции в точке x
  174.     * */
  175.     private double interpolating(double x){
  176.         alphaAndBettaCalc();
  177.         setSplineCafsC();
  178.         setSplineCafsB();
  179.         setSplineCafsD();
  180.         int index;
  181.         if (x <= nodes.get(0)) {
  182.             index = 0;
  183.         } else if (x >= nodes.get(N - 1)) {
  184.             index = N - 1;
  185.         }
  186.         else {
  187.             int i = 0;
  188.             int j = N - 1;
  189.             while (i + 1 < j)
  190.             {
  191.                 int k = i + (j - i) / 2;
  192.                 if (x <= nodes.get(k))
  193.                 {
  194.                     j = k;
  195.                 }
  196.                 else
  197.                 {
  198.                     i = k;
  199.                 }
  200.             }
  201.             index = j;
  202.         }
  203.         double dx = x - nodes.get(index);
  204.         return values.get(index) + (splineCafsB.get(index) + (splineCafsC.get(index) / 2.0 + splineCafsD.get(index) * dx / 6.0) * dx) * dx;
  205.     }
  206.  
  207.     /*
  208.     * Инициализация ArrayList-ов
  209.     * */
  210.     private void init(List<Double> list){
  211.         for (int i = 0; i < N; i++) {
  212.             list.add(0.0);
  213.         }
  214.     }
  215.  
  216.     /*
  217.     * Вывод максимальной погрешности
  218.     * */
  219.     public double getMaxEps(){
  220.         parcingNew();
  221.         calcValInNewNodes();
  222.         double maxEps = -1;
  223.         double eps = 0;
  224.         for (int i = 0; i < 10*N; i++) {
  225.             eps = Math.abs(newValues.get(i) - interpolating(newNodes.get(i)));
  226.             System.out.println(eps + "\t" + "\t" + newNodes.get(i) + "\t" + "\t" + newValues.get(i));
  227.             if (maxEps < eps){
  228.                 maxEps = eps;
  229.             }
  230.         }
  231.         return maxEps;
  232.     }
  233.  
  234.     /*
  235.     * Вывод таблицы погрешностей на экран
  236.     * */
  237.     public void getEpsTable(){
  238.  
  239.     }
  240. }
  241. /*Class Main*/
  242. package package1;
  243.  
  244. public class Main {
  245.  
  246.     public static void main(String[] args) {
  247.         Spline spline = new Spline();
  248.         spline.setA(0);
  249.         spline.setB(2);
  250.         spline.setN(5);
  251.         spline.parcing();
  252.         spline.calcValuesInNodes();
  253.         spline.getTable();
  254.         System.out.println(spline.getMaxEps());
  255.     }
  256. }
Advertisement
Add Comment
Please, Sign In to add comment