libdo

Untitled

Sep 18th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.PrintWriter;
  4.  
  5. import org.apache.commons.math.linear.Array2DRowRealMatrix;
  6. import org.apache.commons.math.linear.ArrayRealVector;
  7. import org.apache.commons.math.linear.DecompositionSolver;
  8. import org.apache.commons.math.linear.LUDecompositionImpl;
  9. import org.apache.commons.math.linear.RealMatrix;
  10. import org.apache.commons.math.linear.RealVector;
  11.  
  12.  
  13. public class Solution {
  14. public final static int a=-1;
  15. public final static int b=1;
  16. public final static int INTEGRAL_STEP=100000;
  17. public final static int lambda=1;
  18. private double h;
  19. private int n=1;
  20. private int sum;
  21. private double B[][];
  22. private double d[];
  23. private double c[];
  24. private double eps_prev=0;
  25. public double f(double x){
  26. return Math.cos(4*Math.PI*x)-
  27. (lambda*2*x*Math.sin(Math.PI*x))/(Math.PI*(x*x-16));
  28. }
  29. public double K(double x, double s){
  30. return Math.cos(Math.PI*x*s);
  31. //return Math.abs(x+s);
  32. }
  33. public double u(double x){
  34. return Math.cos(4*Math.PI*x);
  35. //return Math.abs(x);
  36. }
  37. public double ksi_0(double x){
  38. if (x>=a && x<=(a+h)){
  39. return (a+h-x)/h;
  40. }
  41. else{
  42. return 0;
  43. }
  44. }
  45.  
  46. public double ksi_i(double x, int i){
  47. if (x>=a+(i-1)*h && x<=(a+h*i)){
  48. return (x-(a+(i-1)*h))/h;
  49. }
  50. else
  51. if (x>=a+i*h && x<=(a+h*(i+1))){
  52. return (x+(i+1)*h-x)/h;
  53. }
  54. else{
  55. return 0;
  56. }
  57. }
  58.  
  59. public double ksi_n(double x){
  60. if (x>=a+h*(n-1) && x<=(a+h*n)){
  61. return (a+h-x)/h;
  62. }
  63. else{
  64. return 0;
  65. }
  66. }
  67. public double intergrateBij(int i, int j){
  68. double sum=0;
  69. double h=this.h/INTEGRAL_STEP;;
  70. double x;
  71.  
  72. if (i==0){
  73. for (int k=0; k<INTEGRAL_STEP;k++){
  74. x=a+k*h;
  75. sum+=ksi_0(x)*K(x,a+this.h*j);
  76. }
  77. }
  78. else{
  79. if (i==n){
  80. for (int k=0; k<INTEGRAL_STEP;k++){
  81. x=b-k*h;
  82. sum+=ksi_n(x)*K(x,a+this.h*j);
  83. }
  84. }
  85. else{
  86. double x0=a+(i-1)*this.h;
  87. for (int k=0; k<INTEGRAL_STEP;k++){
  88. x=x0+h*k;
  89. sum+=ksi_i(x,i)*K(x,a+this.h*j);
  90. }
  91. x0=a+i*this.h;
  92. for (int k=0; k<INTEGRAL_STEP;k++){
  93. x=x0+h*k;
  94. sum+=ksi_i(x,i)*K(x,a+this.h*j);
  95. }
  96. }
  97. }
  98. return sum*h;
  99. }
  100. public double integrateDi(int i){
  101. double sum=0;
  102. double h=this.h/INTEGRAL_STEP;;
  103. double x;
  104. if (i==0){
  105. for (int k=0; k<INTEGRAL_STEP;k++){
  106. x=a+k*h;
  107. sum+=ksi_0(x)*f(x);
  108. }
  109. }
  110. else{
  111. if (i==n){
  112. for (int k=0; k<INTEGRAL_STEP;k++){
  113. x=b-k*h;
  114. sum+=ksi_n(x)*f(x);
  115. }
  116. }
  117. else{
  118. double x0=a+(i-1)*this.h;
  119. for (int k=0; k<INTEGRAL_STEP;k++){
  120. x=x0+h*k;
  121. sum+=ksi_i(x,i)*f(x);
  122. }
  123. x0=a+i*this.h;
  124. for (int k=0; k<INTEGRAL_STEP;k++){
  125. x=x0+h*k;
  126. sum+=ksi_i(x,i)*f(x);
  127. }
  128. }
  129. }
  130. return sum*h;
  131. }
  132. public void initMartix(){
  133. d=new double[n+1];
  134. B=new double[n+1][];
  135. for (int i=0; i<n+1; i++){
  136. B[i]=new double[n+1];
  137. }
  138. for (int i=0; i<n+1; i++){
  139. for (int j=0; j<n+1; j++){
  140. B[i][j]=lambda*intergrateBij(i, j);
  141. if (i!=j){
  142. B[i][j]=-B[i][j];
  143. }
  144. else{
  145. B[i][j]=1-B[i][j];
  146. }
  147. }
  148. d[i]=integrateDi(i);
  149. }
  150. RealMatrix coefficients=new Array2DRowRealMatrix(B);
  151. DecompositionSolver solver=new LUDecompositionImpl(coefficients).getSolver();
  152. RealVector constants=new ArrayRealVector(d);
  153. RealVector solution=solver.solve(constants);
  154. c=solution.getData();
  155. }
  156. public double u_wave(double x){
  157. double sum=0;
  158. for (int i=0; i<n+1;i++){
  159. sum+=c[i]*K(x,a+i*h);
  160. }
  161. sum*=lambda;
  162. sum+=f(x);
  163. return sum;
  164. }
  165.  
  166. public void solve() throws FileNotFoundException{
  167. PrintWriter writer;
  168. double x_i;
  169. double eps_max;
  170. double eps;
  171. double u_1,u_2;
  172. long start, finish;
  173. for (int i=1; i<=10; i++){
  174. System.out.println("I="+i);
  175. start=System.currentTimeMillis();
  176. sum=0;
  177. n*=2;
  178. h=(b-a)/(double)n;
  179. initMartix();
  180. eps_max=-1;
  181. for (int j=1; j<=n; j++){
  182. x_i=a+(j-1)*h;
  183. u_1=u(x_i);
  184. u_2=u_wave(x_i);
  185. System.out.println("with u="+u_1+" and u_wave="+u_2);
  186. eps=Math.abs(u_1-u_2);
  187. if (eps>eps_max){
  188. eps_max=eps;
  189. }
  190. }
  191. finish=System.currentTimeMillis();
  192. writer = new PrintWriter(new File("out" + i + ".txt"));
  193. writer.println("h_i = "+h);
  194. writer.println("eps = "+eps_max);
  195. writer.println("r_i = " + Math.log((eps_prev)/eps_max)/Math.log(2));
  196. eps_prev=eps_max;
  197. writer.println("t_i = " + (finish-start));
  198. writer.close();
  199. }
  200.  
  201.  
  202. }
  203.  
  204. }
Add Comment
Please, Sign In to add comment