Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using MaximaSharp;
- using System.Collections;
- namespace _4m_lab3
- {
- class Program
- {
- static SplineTuple[] splines;
- private struct SplineTuple
- {
- public double a, b, c, d, x;
- }
- static void Main(string[] args)
- {
- //Maxima.GnuPlot("plot x/cos(x)");
- //Maxima.GnuPlot("plot 1.0341-0.21178*(x-2)-0.52526*(x-2)**2+0.3029*(x-2)**3");
- //Maxima.GnuPlot("plot 1.0341+-0.21178*(x-2)+-0.52526*(x-2)**2++0.3029*(x-2)**3");
- /*Maxima.GnuPlot(@"
- f(x)= x>=1 & x<2 ? 1.0002+0*(x-1)+0.3134*(x-1)**2+-0.2795*(x-1)**3 : x>=2 && x<3 ? 1.0341+-0.21178*(x-2)+-0.5252*(x-2)**2+0.3029*(x-2)**3 : 0
- plot [0:10] f(x)
- ");*/
- // Maxima.GnuPlot(@"
- // f(x)=0<x<1 ? (x-1)**2 : x>7 ? x : (x-8)**2
- // plot [0:10] f(x)
- // ");
- /* Maxima.GnuPlot(@"
- set parametric
- set pm3d depthorder hidden3d
- set isosamples 15, 15
- splot [-pi:pi][-pi:pi] cos(u)*(cos(v)+3), sin(u)*(cos(v)+3), sin(v) w pm
- ");*/
- string fx;
- int a, b, n;
- //fx = Console.ReadLine();
- //n = Int32.Parse(Console.ReadLine());
- //a = Int32.Parse(Console.ReadLine());
- //b = Int32.Parse(Console.ReadLine());
- n = 6;
- a = 1;
- b = 6;
- List<double> points = new List<double>();
- //points.Add(double.MinValue);
- Random r = new Random( );
- /*for (int i = 0; i < n - 2; ++i)
- {
- points.Add(r.NextDouble() * (b - a) + a);
- }*/
- for (double i = 1.0; i <= 6.0; ++i)
- {
- points.Add(i);
- }
- //points.Add(a);
- //points.Add(b);
- points.Sort();
- List<double> y = new List<double>();
- //for (int i = 0; i < n; ++i)
- //{
- // string func = fx.Replace("x", points[i].ToString().Replace(',','.'));
- // y.Add(double.Parse(Maxima.Eval(func).Replace('.',',')));
- // //Console.WriteLine(Maxima.Eval(func).Replace('.',','));
- //}
- //y.Add(0);
- y.Add(1.0002);
- y.Add(1.0341);
- y.Add(0.6);
- y.Add(0.40105);
- y.Add(0.1);
- y.Add(0.23975);
- foreach(double u in y){
- Console.WriteLine(u);
- }
- Spline(points, y, n);
- //BuildSpline(points, y, n);
- //Cubiq(points, y, n);
- string all = "f(x)=";
- for(int i = 0 ; i < n - 1 ; ++i){
- SplineTuple sp = splines[i];
- //Console.WriteLine(sp.a + " " + sp.b + " " + sp.c + " " + sp.d);
- string cur = "";
- cur += sp.a.ToString();
- cur += "+" + sp.b + "*(x - " + sp.x + ")";
- cur += "+" + sp.c + "*(x - " + sp.x + ")**2";
- cur += "+" + sp.d + "*(x - " + sp.x + ")**3";
- /*cur += sp.a.ToString();
- cur += Sgn(sp.b, false);
- cur += sp.b + "*(x" + Sgn(-sp.x) + -sp.x + ")";
- cur += Sgn(sp.c, false);
- cur += "(" + sp.c + ")" + "*(x" + Sgn(-sp.x) + -sp.x + ")**2";
- cur += Sgn(sp.d, false);
- cur += "(" + sp.d + ")" + "*(x" + Sgn(-sp.x) + -sp.x + ")**3";*/
- cur = cur.Replace(',', '.');
- if(i != 0 && i != n - 2)all += " x>=" + points[i] + " & x<" + points[i + 1] + " ?";
- if (i == 0) all += "x<" + points[i + 1] + " ?";
- //if(i == n-2) all += "x
- all += cur;
- if(i != n - 2)all += ":";
- //if (i + 1 == n - 1) all += "0";
- //Console.WriteLine(cur);
- //Maxima.GnuPlot("plot [0:10] " + cur);
- //Console.ReadKey();
- }
- Console.WriteLine(all);
- all += "\n";
- all += "plot [1:6] f(x)";
- Maxima.GnuPlot(all);
- //string fplot = "plot [" + a.ToString() + ":" + b.ToString() + "] " + fx + " x+1";
- //Maxima.GnuPlot(fplot);
- //Maxima.Eval("plot2d([[parametric, cos(t), sin(t), [t, 0, 2*%pi]], -abs(x)], [x, -sqrt(2) , sqrt(2)] , same_xy)");
- //for (int i = 0; i < n; ++i)Console.WriteLine(points[i]);
- //while (true)
- //{
- // s = Console.ReadLine();
- // Console.Write(Maxima.Eval(s) + "\n");
- //}
- Console.ReadKey();
- // System.
- }
- public static string Sgn(double d , bool flag = true)
- {
- if (d >= 0) return flag ? "-" : "+";
- return "";
- }
- //public static double[] Tridiagonal(double[,] A , double[] B , int n)
- //{
- // double[] x = new double[n];
- // double[] alpha = new double[n - 1];
- // double[] beta = new double[n - 1];
- // alpha[0] = -A[2,0] / A[1,0];
- // beta[0] = B[0] / A[1, 0];
- // for (int i = 1; i < n - 1; ++i)
- // {
- // alpha[i] = -A[2, i] / (A[1, i] + A[0, i] * alpha[i - 1]);
- // beta[i] = (B[i] - A[0, i] * beta[i - 1]) / (A[1, i] + A[0, i] * alpha[i - 1]);
- // }
- // x[n - 1] = (B[n - 1] - A[0, n - 1] * beta[n - 2]) / (A[1, n - 1] + A[0, n - 1] * alpha[n - 2]);
- // for (int i = n - 2; i > - 1; --i)
- // {
- // x[i] = x[i + 1] * alpha[i] + beta[i];
- // //Console.WriteLine((i + 1).ToString() + " " + i.ToString());
- // }
- // return x;
- //}
- public static void Spline(List<double> x, List<double> y, int n)
- {
- splines = new SplineTuple[n-1];
- for (int i = 0; i < n - 1; ++i)
- {
- splines[i].x = x[i];
- splines[i].a = y[i];
- }
- double[] alpha = new double[n-2];
- double[] beta = new double[n-2];
- double[] gamma = new double[n-2];
- double[] delta = new double[n-2];
- for (int i = 1; i <= n - 3; ++i)
- {
- double hi = x[i + 1] - x[i];
- alpha[i] = 1.0 / hi;
- }
- for (int i = 0; i <= n - 3; ++i)
- {
- double hi = x[i + 1] - x[i];
- double hii = x[i + 2] - x[i + 1];
- beta[i] = 2.0 * ((1.0 / hi) + (1.0 / hii));
- }
- for (int i = 0; i <= n - 4; ++i)
- {
- double hii = x[i + 2] - x[i + 1];
- gamma[i] = 1.0 / hii;
- }
- for (int i = 0; i <= n - 3; ++i)
- {
- double hi = x[i + 1] - x[i];
- double hii = x[i + 2] - x[i + 1];
- double fi = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
- double fii = (y[i + 2] - y[i + 1]) / (x[i + 2] - x[i + 1]);
- delta[i] = 3.0 * ((fii / hii) + (fi / hi));
- }
- double[,] A = new double[n-2, n-2];
- A[0,0] = beta[0];
- A[0,1] = gamma[0];
- A[n - 3, n - 3] = beta[n - 3];
- A[n - 3, n - 4] = alpha[n - 3];
- for (int i = 1; i <= n - 4; ++i)
- {
- A[i, i - 1] = alpha[i];
- A[i, i] = beta[i];
- A[i, i + 1] = gamma[i];
- }
- /*for (int i = 0; i < alpha.Length; ++i)
- {
- Console.Write(alpha[i] + " ");
- }*/
- for (int i = 0; i <= n - 3; ++i)
- {
- for (int j = 0; j <= n - 3 ; ++j)
- {
- Console.Write(A[i, j] + " ");
- }
- Console.WriteLine(delta[i]);
- }
- double[] tmp = Tridiagonal(A, delta , n - 2);
- double[] b = new double[n];
- b[0] = 0;
- b[n - 1] = 0;
- for (int i = 1; i <= n - 2; ++i)
- {
- b[i] = tmp[i - 1];
- }
- double[] c = new double[n - 1];
- for(int i = 0 ; i < n - 1 ; ++i){
- double fi = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
- double hi = x[i + 1] - x[i];
- c[i] = (3 * fi - b[i+1] - 2 * b[i])/hi;
- }
- double[] d = new double[n-1];
- for (int i = 0; i < n - 1; ++i)
- {
- double fi = (y[i + 1] - y[i]) / (x[i + 1] - x[i]);
- double hi = x[i + 1] - x[i];
- d[i] = (b[i] + b[i + 1] - 2 * fi) / Math.Pow(hi, 2);
- }
- for (int i = 0; i < n - 1; ++i)
- {
- splines[i].a = y[i];
- splines[i].b = b[i];
- splines[i].c = c[i];
- splines[i].d = d[i];
- //Console.WriteLine(y[i] + " " + b[i] + " " + c[i] + " " + d[i] + " ");
- }
- }
- public static double[] Tridiagonal(double[,] A, double[] b, int n)
- {
- double[] x = new double[n];
- double[] alpha = new double[n+10];
- double[] beta = new double[n+10];
- alpha[1] = -A[0,1] / A[0,0];
- beta[1] = b[0] / A[0,0];
- for (int i = 1; i <= n - 2; ++i)
- {
- alpha[i + 1] = -A[i, i + 1] / (A[i, i - 1] * alpha[i] + A[i, i]);
- beta[i + 1] = (b[i] - (A[i, i - 1] * beta[i])) / (A[i, i - 1] * alpha[i] + A[i, i]);
- }
- x[n - 1] = (b[n - 1] - (A[n - 1,n - 2] * beta[n - 1])) / (A[n - 1,n - 1] + (A[n - 1,n - 2] * alpha[n - 1]));
- for (int i = n - 2; i >= 0; --i)
- {
- x[i] = (alpha[i + 1] * x[i + 1]) + beta[i + 1];
- }
- return x;
- }
- //public static void BuildSpline(List<double> x, List<double> y, int n)
- //{
- // splines = new SplineTuple[n];
- // for (int i = 0; i < n ; ++i)
- // {
- // splines[i].x = x[i];
- // splines[i].a = y[i];
- // }
- // double[] a = new double[n - 1];
- // double[] b = new double[n];
- // double[] c = new double[n - 1];
- // double[] d = new double[n - 1];
- // double[] delta = new double[n - 1];
- // double[] h = new double[n - 1];
- // double[,] A = new double[3, n];
- // double[] f = new double[n];
- // double x3, xn;
- // if (n < 3) return;
- // x3 = splines[2].x - splines[0].x;
- // xn = splines[n - 1].x - splines[n - 3].x;
- // for (int i = 0; i < n - 1; ++i)
- // {
- // a[i] = splines[i].a;
- // h[i] = splines[i + 1].x - splines[i].x;
- // delta[i] = (splines[i + 1].a - splines[i].a) / h[i];
- // A[0, i] = i > 0 ? h[i] : x3;
- // f[i] = i > 0 ? 3 * (h[i] * delta[i - 1] + h[i - 1] * delta[i]) : 0;
- // }
- // A[1, 0] = h[0];
- // A[2, 0] = h[0];
- // int k = n - 1;
- // for (int i = 1; i < n - 1; ++i)
- // {
- // A[1, i] = 2 * (h[i] + h[i - 1]);
- // A[2, i] = h[i];
- // }
- // A[1, n - 1] = h[n - 2];
- // A[2, n - 1] = xn;
- // A[0, n - 1] = h[n - 2];
- // f[0] = ((h[0] + 2 * x3) * h[1] * delta[0] + Math.Pow(h[0], 2) * delta[1]) / x3;
- // f[n - 1] = (Math.Pow(h[n - 2], 2) * delta[n - 3] + (2 * xn + h[n - 2]) * h[n - 3] * delta[n - 2]) / xn;
- // b = Tridiagonal(A, f,n);
- // for (int i = 0; i < n - 1; ++i)
- // {
- // d[i] = (b[i + 1] + b[i] - 2 * delta[i]) / (h[i] * h[i]);
- // c[i] = 2 * (delta[i] - b[i]) / h[i] - (b[i + 1] - delta[i]) / h[i];
- // splines[i].a = a[i];
- // splines[i].b = b[i];
- // splines[i].c = c[i];
- // splines[i].d = d[i];
- // }
- //}
- public static void Cubiq(List<double> x, List<double> y, int n)
- {
- splines = new SplineTuple[n];
- for (int i = 0; i < n; ++i)
- {
- splines[i].x = x[i];
- splines[i].a = y[i];
- }
- splines[0].c = 0.0;
- splines[n - 1].c = 0.0;
- double[] alpha = new double[n - 1];
- double[] beta = new double[n - 1];
- alpha[0] = 0.0;
- beta[0] = 0.0;
- for (int i = 1; i < n - 1; ++i)
- {
- double hi = x[i] - x[i - 1];
- double hi1 = x[i + 1] - x[i];
- double A = hi;
- double C = 2.0 * (hi + hi1);
- double B = hi1;
- double F = 6.0 * ((y[i + 1] - y[i]) / hi1 - (y[i] - y[i - 1]) / hi);
- double z = (A * alpha[i - 1] + C);
- alpha[i] = -B / z;
- beta[i] = (F - A * beta[i - 1]) / z;
- }
- for (int i = n - 2; i > 0; --i)
- {
- splines[i].c = alpha[i] * splines[i + 1].c + beta[i];
- }
- for (int i = n - 1; i > 0; --i)
- {
- double hi = x[i] - x[i - 1];
- splines[i].d = (splines[i].c - splines[i - 1].c) / hi;
- splines[i].b = hi * (2.0 * splines[i].c + splines[i - 1].c) / 6.0 + (y[i] - y[i - 1]) / hi;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement