Advertisement
Guest User

Untitled

a guest
May 20th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.44 KB | None | 0 0
  1. package com.company;
  2.  
  3.  
  4. import javax.script.ScriptEngine;
  5. import javax.script.ScriptEngineManager;
  6. import java.beans.Expression;
  7. import java.io.Reader;
  8.  
  9. public class Main {
  10.  
  11.     /*  Aproksymacja
  12.     *
  13.     * - aproksymacja punktowa
  14.     * - wielomiany ortogonalne
  15.     * - aproksymacja średniokwadratowa ciągła
  16.     *
  17.     * */
  18.  
  19.  
  20.  
  21.  
  22.     private static double[] gauss(double s[][]) {
  23.  
  24.         int n = s.length;
  25.         for (int i = 0; i < n; i++) {
  26.             double maxEl = Math.abs(s[i][i]);
  27.             int maxRow = i;
  28.             for (int k = i + 1; k < n; k++) {
  29.                 if (Math.abs(s[k][i]) > maxEl) {
  30.                     maxEl = Math.abs(s[k][i]);
  31.                     maxRow = k;
  32.                 }
  33.             }
  34.  
  35.             for (int k = i; k < n + 1; k++) {
  36.                 double tmp = s[maxRow][k];
  37.                 s[maxRow][k] = s[i][k];
  38.                 s[i][k] = tmp;
  39.             }
  40.  
  41.             for (int k = i + 1; k < n; k++) {
  42.                 double c = -s[k][i] / s[i][i];
  43.                 for (int j = i; j < n + 1; j++) {
  44.                     if (i == j) {
  45.                         s[k][j] = 0;
  46.                     } else {
  47.                         s[k][j] += c * s[i][j];
  48.                     }
  49.                 }
  50.             }
  51.         }
  52.  
  53.         double[] var = new double[n];
  54.         for (int i = n - 1; i > -1; i--) {
  55.             var[i] = s[i][n] / s[i][i];
  56.             for (int k = i - 1; k > -1; k--) {
  57.                 s[k][n] -= s[k][i] * var[i];
  58.             }
  59.         }
  60.  
  61.         return var;
  62.     }
  63.  
  64.  
  65.  
  66.     private static void aproksymacjaSredniokwadratowa(int n, double a, double b, double px, double _x) {
  67.  
  68.         double [][]A = new double[n][n+1];
  69.  
  70.         int precyzja = 1000;
  71.         double []fx = new double[precyzja+1];
  72.         double []x = new double[precyzja+1];
  73.  
  74.  
  75.         for (int i=0; i<n; i++) {
  76.             for (int j=0; j<n+1; j++) {
  77.                 if(j<n) {
  78.                     for(int k=0; k<precyzja; k++) {
  79.                         x[k] = a + (k*(b-a))/precyzja;
  80.                         fx[k] = Math.pow(x[k], i) * Math.pow(x[k], j) * px;
  81.                     }
  82.                 } else {
  83.                     for(int k=0; k<precyzja; k++) {
  84.                         x[k] = a + (k*(b-a))/precyzja;
  85.                         fx[k] = Math.pow(x[k], i) * Math.sqrt( x[k]*x[k] + 3*x[k] +7 ) * px;
  86.                     }
  87.                 }
  88.                 A[i][j] = trapez(precyzja,a,b,fx);
  89.             }
  90.         }
  91.  
  92.  
  93.         double []W = gauss(A);
  94.         double result = 0;
  95.         for (int i=0; i<W.length; i++) {
  96.             result += W[i] * Math.pow(_x,i);
  97.         }
  98.         System.out.println(result);
  99.     }
  100.  
  101.     private static void wielomianyOrtogonalny(int n, double a, double b, double px, double x){
  102.         int precyzja = 1000;
  103.  
  104.         double []fx = new double[precyzja+1];
  105.         double []xi = new double[precyzja+1];
  106.  
  107.         double []Fi = new double[n+1];
  108.         double []_Fi = new double[n+1];
  109.         double []Lambda = new double[n+1];
  110.         double []C = new double[n+1];
  111.  
  112.  
  113.         double gx = 0;
  114.  
  115.         for (int i=0; i<=n; i++) {
  116.  
  117.             for(int j=0; j<=precyzja; j++) {
  118.                 xi[j] = a + (j*(b-a))/precyzja;
  119.  
  120.                 Fi[0] = 1;
  121.                 Fi[1] = xi[j];
  122.                 Fi[2] = 1.0/2 * (3*xi[j]*xi[j] - 1);
  123.  
  124.                 if(i>2) Fi[i] = 1.0/i *((2*(i-1)+1)*xi[j] * Fi[i-1] - (i-1)*Fi[i-2] );
  125.  
  126.                 fx[j] = px * Math.pow(Fi[i],2);
  127.             }
  128.  
  129.             Lambda[i] =  trapez(precyzja,a,b,fx);
  130.  
  131.             for(int j=0; j<=precyzja; j++) {
  132.                 xi[j] = a + (j*(b-a))/precyzja;
  133.  
  134.                 Fi[0] = 1;
  135.                 _Fi[0] = 1;
  136.                 Fi[1] = xi[j];
  137.                 _Fi[1] = x;
  138.                 Fi[2] = 1.0/2 * (3*xi[j]*xi[j] - 1);
  139.                 _Fi[2] = 1.0/2 * (3*x*x - 1);
  140.  
  141.                 if(i>2) {
  142.                     Fi[i] = 1.0/i *((2*(i-1)+1)*xi[j] * Fi[i-1] - (i-1)*Fi[i-2] );
  143.                     _Fi[i] = 1.0/i *((2*(i-1)+1)*x * Fi[i-1] - (i-1)*Fi[i-2] );
  144.                 }
  145.  
  146.                 fx[j] = px * Fi[i] * Math.sqrt( xi[j]*xi[j] + 3*xi[j] +7 );
  147.             }
  148.  
  149.             C[i] = (1.0/Lambda[i]) * trapez(precyzja,a,b,fx);
  150.             gx += C[i]*_Fi[i];
  151.  
  152.         }
  153.  
  154.         System.out.println(gx);
  155.     }
  156.  
  157.     private static void aproksymacjaPunktowa(int n, double _x){
  158.         double []x = {-1, -0.5, 0, 0.5, 1};
  159.         double []fx = new double[x.length];
  160.  
  161.         // wyliczanie fx
  162.         for(int i=0; i<x.length; i++) {
  163.             fx[i] = Math.sqrt(x[i] * x[i] + 3 * x[i] + 7);
  164.         }
  165.  
  166.         double s[][] = new double[x.length][n + 2*n + 2];
  167.         double sum[] = new double[n + 2*n + 2];
  168.  
  169.         // tworzenie macierzy
  170.         for(int i=0; i < x.length; i++) {
  171.             for(int j=0, k=0; j <= n + 2*n +1 ; j++) {
  172.                 // x^n * y
  173.                 if(j>2*n)  {
  174.                     s[i][j] = Math.pow(x[i], k) * fx[i];
  175.                     k++;
  176.                 } else {
  177.                     s[i][j] = Math.pow(x[i],j);
  178.                 }
  179.             }
  180.         }
  181.  
  182.         // wyliczanie sumy
  183.         for(int i=0; i <= n + 2*n +1  ; i++) {
  184.             sum[i] = 0;
  185.  
  186.             for(int j=0; j < x.length; j++) {
  187.                sum[i] += s[j][i];
  188.             }
  189.         }
  190.  
  191.         double _s[][] = new double[n+1][n+2];
  192.         //tworzenie macierzy z sum
  193.         for(int i=0, k=0; i <= n; i++) {
  194.             for(int j=0, z=i; j <= n+1; j++, z++) {
  195.                 if (j == n + 1) {
  196.                     _s[i][j] = sum[2 * n + k + 1];
  197.                     k++;
  198.                 } else {
  199.                     _s[i][j] = sum[z];
  200.                 }
  201.             }
  202.         }
  203.  
  204.         double aGauss[] = gauss(_s);
  205.         double result = 0;
  206.         for(int i=0; i<n; i++) {
  207.             result += aGauss[i] * Math.pow(_x,i);
  208.         }
  209.  
  210.         System.out.println(result);
  211.     }
  212.  
  213.     private static double trapez(int precyzja, double a, double b, double []fx) {
  214.  
  215.         double h = (b-a)/precyzja;
  216.         double result = 0;
  217.  
  218.         for(int i=1; i<=precyzja; i++) {
  219.             result+= fx[i-1] + fx[i];
  220.         } result += h/2;
  221.  
  222.         return result/precyzja;
  223.     }
  224.  
  225.  
  226.  
  227.     public static void main(String[] args) {
  228.  
  229.         int n = 50;
  230.         double a = -1,
  231.                b = 1;
  232.  
  233.         aproksymacjaSredniokwadratowa(n,a,b,1,-0.25);
  234.         wielomianyOrtogonalny(n,a,b,1, -0.25);
  235.         aproksymacjaPunktowa(n,-0.25);
  236.     }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement