示例#1
0
 public static void addFunction(string name, ParserFunction function)
 {
     m_functions[name] = function;
 }
示例#2
0
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                List <TextBox> textBoxes = new List <TextBox>
                {
                    textBox1,
                    textBox2,
                    textBox3,
                    textBox4,
                    textBox5,
                    textBox6,
                    textBox7,
                    textBox8,
                    textBox9,
                    textBox10,
                    textBox11,
                    textBox12,
                    textBox13
                };
                foreach (var s in textBoxes)
                {
                    if (s.Text == "")
                    {
                        s.Text = "0";
                    }
                }

                ParserFunction.addFunction("sin", new SinFunction());
                ParserFunction.addFunction("cos", new CosFunction());
                ParserFunction.addFunction("pi", new PiFunction());
                ParserFunction.addFunction("exp", new ExpFunction());
                ParserFunction.addFunction("pow", new PowFunction());
                ParserFunction.addFunction("abs", new AbsFunction());
                ParserFunction.addFunction("sqrt", new SqrtFunction());
                ParserFunction.addFunction("x", new XFunction());

                double a = textBox5.Text == "0" ? double.Parse(textBox7.Text) : double.Parse(textBox5.Text);
                double b = textBox10.Text == "0" ? double.Parse(textBox12.Text) : double.Parse(textBox10.Text);

                double A     = double.Parse(textBox8.Text);
                double B     = double.Parse(textBox13.Text);
                double alfa0 = double.Parse(textBox4.Text);
                double alfa1 = double.Parse(textBox6.Text);
                double beta0 = double.Parse(textBox9.Text);
                double beta1 = double.Parse(textBox11.Text);

                double h      = double.Parse(textBox14.Text);
                int    N      = (int)Math.Round((b - a) / h);
                string uravnP = textBox1.Text;
                string uravnQ = textBox2.Text;
                string uravnF = textBox3.Text;

                double[] m = new double[N + 1];
                double[] x = new double[N + 1];
                double[] n = new double[N + 1];
                double[] C = new double[N + 1];
                double[] d = new double[N + 1];
                double[] y = new double[N + 1];
                x[0] = a;
                for (int i = 1; i <= N; i++)
                {
                    x[i] = x[0] + i * h;
                }

                if (comboBox1.Text == "Метод прогонки")
                {
                    for (int i = 0; i <= N; i++)
                    {
                        m[i] = -2 + h * Parser.process(x[i], uravnP);
                        n[i] = 1 - h * Parser.process(x[i], uravnP) + Parser.process(x[i], uravnQ) * Math.Pow(h, 2);
                    }

                    C[0] = (alfa1 - alfa0 * h) / (m[0] * (alfa1 - alfa0 * h) + n[0] * alfa1);
                    d[0] = (n[0] * A * h) / (alfa1 - alfa0 * h) + Parser.process(x[0], uravnF) * Math.Pow(h, 2);
                    for (int i = 1; i < N - 1; i++)
                    {
                        C[i] = 1 / (m[i] - n[i] * C[i - 1]);
                        d[i] = Parser.process(x[i], uravnF) * Math.Pow(h, 2) - n[i] * C[i - 1] * d[i - 1];
                    }

                    y[N] = (beta1 * C[N - 2] * d[N - 2] + B * h) / (beta1 * (1 + C[N - 2]) + beta0 * h);
                    for (int i = N - 1; i > 0; i--)
                    {
                        y[i] = C[i - 1] * (d[i - 1] - y[i + 1]);
                    }
                    y[0] = (alfa1 * y[1] - A * h) / (alfa1 - alfa0 * h);

                    Color c1 = Color.FromArgb(255, 0, 0);
                    Color c2 = Color.FromArgb(128, 0, 255);
                    if (checkBox1.Checked == true && progonkiAll == true)
                    {
                        OutputAll(N, m, x, n, C, d, y, "Метод прогонки", c1);
                        progonkiAll = false;
                    }

                    else if (checkBox1.Checked == false)
                    {
                        OutputOne(N, m, x, n, C, d, y, "Метод прогонки", c2, 0);
                    }
                }
                if (comboBox1.Text == "Метод прогонки с центральной разностью")
                {
                    for (int i = 0; i <= N; i++)
                    {
                        m[i] = (2 * Parser.process(x[i], uravnQ) * Math.Pow(h, 2) - 4) / (2 + h * Parser.process(x[i], uravnP));
                        n[i] = (2 - h * Parser.process(x[i], uravnP)) / (2 + h * Parser.process(x[i], uravnP));
                    }

                    C[1] = (alfa1 - alfa0 * h) / (m[1] * (alfa1 - alfa0 * h) + n[1] * alfa1);
                    d[1] = (2 * Parser.process(x[1], uravnF) * Math.Pow(h, 2)) / (2 + h * Parser.process(x[1], uravnP)) + (n[1] * A * h) / (alfa1 - alfa0 * h);
                    for (int i = 2; i <= N; i++)
                    {
                        C[i] = 1 / (m[i] - n[i] * C[i - 1]);
                        d[i] = ((2 * Parser.process(x[i], uravnF) * Math.Pow(h, 2)) / (2 + h * Parser.process(x[i], uravnP)) - n[i] * C[i - 1] * d[i - 1]);
                    }

                    y[N] = ((2 * B * h) - beta1 * (d[N] - C[N - 1] * d[N - 1])) / ((2 * beta0 * h) + beta1 * (C[N - 1] - (1 / C[N])));
                    for (int i = N - 1; i > 0; i--)
                    {
                        y[i] = C[i] * (d[i] - y[i + 1]);
                    }
                    y[0] = (A * h - alfa1 * y[1]) / (alfa0 * h - alfa1);

                    Color c1 = Color.FromArgb(0, 0, 255);
                    Color c2 = Color.FromArgb(128, 0, 255);
                    if (checkBox1.Checked == true && progonkiScentrAll == true)
                    {
                        OutputAll(N, m, x, n, C, d, y, "Метод прогонки с центральной разностью", c1);
                        progonkiScentrAll = false;
                    }

                    else if (checkBox1.Checked == false)
                    {
                        OutputOne(N, m, x, n, C, d, y, "Метод прогонки с центральной разностью", c2, 1);
                    }
                }
                if (comboBox1.Text == "") // пока что не работает  "Метод конечных разностей")
                {
                    double   s        = 0;
                    double[] strichY  = new double[N];
                    double[] strich2Y = new double[N];
                    double[] gausY    = new double[N];
                    double[,] gausA = new double[N, N];
                    double[] gausB = new double[N];
                    double[] gausX = new double[N];


                    for (int i = 0; i < N; i++)
                    {
                        strichY[i]  = (y[i + 1] - y[i]) / h;
                        strich2Y[i] = (y[i + 2] - 2 * y[i + 1] + y[i]) / Math.Pow(h, 2);

                        gausY[i] = strichY[i] * y[i];


                        //Parser.process(x[i], uravnF) = (y[i - 1] + 2 * y[i] + y[i - 1]) / Math.Pow(h, 2) + Parser.process(x[i], uravnP) * (y[i + 1] - y[i - 1]) / 2 * h + Parser.process(x[i], uravnQ) * y[i];
                        //alfa0*y[0]+alfa1 * (y[1] - y[0]) / h = A;
                        // beta0 * y[0]+beta1 * (y[1] - y[0]) / h = B;
                    }


                    for (int i = 0; i < N; i++)
                    {
                        gausX[i] = 0;
                    }

                    for (int i = 0; i < N; i++)
                    {
                        for (int j = 0; j < N; j++)
                        {
                            // gausA[i, j] = double.Parse(x[i]);
                        }
                    }

                    for (int i = 0; i < N; i++)
                    {
                        gausB[i] = double.Parse(Console.ReadLine());
                    }

                    for (int k = 0; k < N - 1; k++)
                    {
                        for (int i = k + 1; i < N; i++)
                        {
                            for (int j = k + 1; j < N; j++)
                            {
                                gausA[i, j] = gausA[i, j] - gausA[k, j] * (gausA[i, k] / gausA[k, k]);
                            }
                            gausB[i] = gausB[i] - gausB[k] * gausA[i, k] / gausA[k, k];
                        }
                    }
                    for (int k = N - 1; k >= 0; k--)
                    {
                        s = 0;
                        for (int j = k + 1; j < N; j++)
                        {
                            s = s + gausA[k, j] * gausX[j];
                        }
                        gausX[k] = (gausB[k] - s) / gausA[k, k];
                    }
                    for (int i = 0; i < gausX.Length; i++)
                    {
                    }
                }
            }
            catch (Exception exept)
            {
                MessageBox.Show("Решить не удалось" + ".\n " + exept.Message + "\n " + "Проверьте ввод данных:" + "\n ");
            }
        }