Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import javax.swing.*;
- import javax.swing.border.EmptyBorder;
- import javax.swing.border.LineBorder;
- import java.awt.*;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.event.MouseListener;
- import java.awt.geom.Arc2D;
- import java.util.Set;
- /**
- * Created by Максим on 06.03.2016.
- */
- public class BoundaryValueProblem extends JFrame {
- double a,b,c,d,e,f,g,h,H;
- int N;
- double[][] y;
- BoundaryValueProblem()
- {
- super("Решение краевой задачи");
- setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- Box box0 = Box.createVerticalBox();
- JPanel panel = new JPanel();
- panel.setLayout(new GridLayout(1,3,10,10));
- JLabel label1 = new JLabel("<html>Дана краевая задача:<br>"+
- "y\"-p(x)y'-q(x)y=g(x)<br>"+"y(a)=A<br>"+
- "y(b)=B,<br>"+"где <br>"+"p(x)=cx+d<br>"+
- "q(x)=ex+f<br>"+"g(x)=gx+h<br>");
- label1.setFont(new Font("Courier New", Font.PLAIN, 22));
- Box box = Box.createVerticalBox();
- Box box2 = Box.createVerticalBox();
- Box[] smallBoxes = new Box[11];
- JTextField[] textFields = new JTextField[11];
- int k=0;
- Character[] chars = new Character[11];
- for(char i='a';i<='h';i++,k++) {
- chars[k]=i;
- }
- chars[8]='A';
- chars[9]='B';
- chars[10]='N';
- for(int i=0; i<11;i++) {
- smallBoxes[i] = Box.createHorizontalBox();
- smallBoxes[i].setBorder(new EmptyBorder(12,12,12,12));
- JLabel label = new JLabel(Character.toString(chars[i])+" = ");
- label.setFont(new Font("Courier New", Font.PLAIN, 18));
- smallBoxes[i].add(label);
- textFields[i] = new JTextField(2);
- textFields[i].setFont(new Font("Courier New", Font.PLAIN, 18));
- textFields[i].setText("0");
- smallBoxes[i].add(textFields[i]);
- if(i<=5)
- box.add(smallBoxes[i]);
- else box2.add(smallBoxes[i]);
- }
- JButton ok = new JButton("Рассчитать");
- ok.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent mouseEvent) {
- try {
- a = Double.parseDouble(textFields[0].getText());
- b = Double.parseDouble(textFields[1].getText());
- c = Double.parseDouble(textFields[2].getText());
- d = Double.parseDouble(textFields[3].getText());
- e = Double.parseDouble(textFields[4].getText());
- f = Double.parseDouble(textFields[5].getText());
- g = Double.parseDouble(textFields[6].getText());
- h = Double.parseDouble(textFields[7].getText());
- N = Integer.parseInt(textFields[10].getText());
- y = new double[N][N + 1];
- y[0][N] = Double.parseDouble(textFields[8].getText());
- y[N - 1][N] = Double.parseDouble(textFields[9].getText());
- Solution();
- } catch (ArrayIndexOutOfBoundsException l) {JOptionPane.showMessageDialog(null, "Неверные данные");}
- }
- });
- box2.add(ok);
- panel.add(label1);
- panel.add(box);
- panel.add(box2);
- setContentPane(panel);
- pack();
- }
- double P(double x)
- {
- return c*x+d;
- }
- double Q(double x)
- {
- return e*x+f;
- }
- double F(double x)
- {
- return g*x+h;
- }
- void Solution() {
- H = (double) (b-a)/N;
- double[] x = new double[N];
- double[] X = new double[N+1];
- double[] P = new double[N+1];
- double[] Q = new double[N+1];
- for (int i = 0; i < N; i++)
- {
- x[i]=a+i*H;
- }
- for(int i=1;i<N-1;i++)
- y[i][N]=F(x[i]);
- //решения начальное и конечное
- X[0]=y[0][N];
- X[N]=y[N-1][N];
- y[0][0]=-2-H*H*Q(x[1]);
- y[0][1]=1+(P(x[1])*H)/2;
- y[0][N]=H*H*F(x[1]) - (1-(P(x[1])*H)/2);
- y[N-1][N-1]=1;
- int l = 1;
- while(l<N-1)
- {
- y[l][l-1] = 1 - (P(x[l+1])*H)/2;
- y[l][l]=-2 - H*H*Q(x[l+1]);
- y[l][l+1]= 1 + (P(x[l+1])*H)/2;
- l++;
- }
- P[0]=-y[0][1]/y[0][0];
- Q[0]=y[0][N]/y[0][0];
- for(int i=1;i<N-1;i++) {
- P[i] = -y[i][i + 1] / (y[i][i] + y[i][i - 1] * P[i - 1]);
- Q[i] = (y[i][i+2]-y[i][i-1]*Q[i-1])/(y[i][i] + y[i][i - 1] * P[i - 1]);
- }
- for(int i=N-2;i>=0;i--) {
- X[i+1] = P[i] * X[i + 2] + Q[i];
- }
- /* for (int i=0;i<N;i++)
- {
- for(int k=0;k<=N;k++)
- {
- System.out.printf("%.2f \t",y[i][k] );
- }
- System.out.println();
- }*/
- Box box = Box.createHorizontalBox();
- box.setBorder(new EmptyBorder(12,12,12,12));
- for (int i=0;i<=N;i++)
- {
- X[i] = X[i] * 1000;
- int m = (int) Math.round(X[i]);
- X[i] = (double)m / 1000;
- System.out.println(X[i]);
- JLabel label = new JLabel(new Double(X[i]).toString());
- box.add(label);
- box.add(Box.createHorizontalStrut(15));
- }
- setContentPane(box);
- pack();
- box.setVisible(true);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment