当前位置: 首页 > news >正文

C#,数值计算——函数计算,Ratfn的计算方法与源程序

1 文本格式

using System;

namespace Legalsoft.Truffer
{
    public class Ratfn
    {
        private double[] cofs { get; set; }
        private int nn { get; set; }
        private int dd { get; set; }

        public Ratfn(double[] num, double[] den)
        {
            this.cofs = new double[num.Length + den.Length - 1];
            this.nn = num.Length;
            this.dd = den.Length;

            for (int j = 0; j < nn; j++)
            {
                cofs[j] = num[j] / den[0];
            }
            for (int j = 1; j < dd; j++)
            {
                cofs[j + nn - 1] = den[j] / den[0];
            }
        }

        public Ratfn(double[] coffs, int n, int d)
        {
            this.cofs = Globals.CopyFrom(coffs);
            this.nn = n;
            this.dd = d;
        }

        public double get(double x)
        {
            double sumn = 0.0;
            double sumd = 0.0;
            for (int j = nn - 1; j >= 0; j--)
            {
                sumn = sumn * x + cofs[j];
            }
            for (int j = nn + dd - 2; j >= nn; j--)
            {
                sumd = sumd * x + cofs[j];
            }
            return sumn / (1.0 + x * sumd);
        }

        public static Ratfn pade(double[] cof)
        {
            int n = (cof.Length - 1) / 2;
            double[,] q = new double[n, n];
            double[,] qlu = new double[n, n];
            double[] x = new double[n];
            double[] y = new double[n];
            for (int j = 0; j < n; j++)
            {
                y[j] = cof[n + j + 1];
                for (int k = 0; k < n; k++)
                {
                    q[j, k] = cof[j - k + n];
                }
            }

            LUdcmp lu = new LUdcmp(q);
            lu.solve( y,  x);

            for (int j = 0; j < 4; j++)
            {
                lu.mprove(y,  x);
            }
            for (int k = 0; k < n; k++)
            {
                double sum = cof[k + 1];
                for (int j = 0; j <= k; j++)
                {
                    sum -= x[j] * cof[k - j];
                }
                y[k] = sum;
            }

            double[] num = new double[n + 1];
            double[] denom = new double[n + 1];
            num[0] = cof[0];
            denom[0] = 1.0;
            for (int j = 0; j < n; j++)
            {
                num[j + 1] = y[j];
                denom[j + 1] = -x[j];
            }
            return new Ratfn(num, denom);
        }

        public static Ratfn ratlsq(UniVarRealValueFun fn, double a, double b, int mm, int kk, ref double dev)
        {
            const int NPFAC = 8;
            const int MAXIT = 5;
            const double BIG = 1.0e99;
            const double PIO2 = 1.570796326794896619;

            int ncof = mm + kk + 1;
            int npt = NPFAC * ncof;
            double[] bb = new double[npt];
            double[] coff = new double[ncof];
            double[] ee = new double[npt];
            double[] fs = new double[npt];
            double[] wt = new double[npt];
            double[] xs = new double[npt];
            double[,] u = new double[npt, ncof];
            Ratfn ratbest = new Ratfn(coff, mm + 1, kk + 1);

            dev = BIG;
            for (int i = 0; i < npt; i++)
            {
                if (i < (npt / 2) - 1)
                {
                    double hth = PIO2 * i / (npt - 1.0);
                    xs[i] = a + (b - a) * Globals.SQR(Math.Sin(hth));
                }
                else
                {
                    double hth = PIO2 * (npt - i) / (npt - 1.0);
                    xs[i] = b - (b - a) * Globals.SQR(Math.Sin(hth));
                }
                fs[i] = fn.funk(xs[i]);
                wt[i] = 1.0;
                ee[i] = 1.0;
            }
            double e = 0.0;
            for (int it = 0; it < MAXIT; it++)
            {
                for (int i = 0; i < npt; i++)
                {
                    double power = wt[i];
                    bb[i] = power * (fs[i] + Globals.SIGN(e, ee[i]));
                    for (int j = 0; j < mm + 1; j++)
                    {
                        u[i, j] = power;
                        power *= xs[i];
                    }
                    power = -bb[i];
                    for (int j = mm + 1; j < ncof; j++)
                    {
                        power *= xs[i];
                        u[i, j] = power;
                    }
                }
                SVD svd = new SVD(u);
                svd.solve(bb,  coff);
                double devmax = 0.0;
                double sum = 0.0;
                Ratfn rat = new Ratfn(coff, mm + 1, kk + 1);
                for (int j = 0; j < npt; j++)
                {
                    ee[j] = rat.get(xs[j]) - fs[j];
                    wt[j] = Math.Abs(ee[j]);
                    sum += wt[j];
                    if (wt[j] > devmax)
                    {
                        devmax = wt[j];
                    }
                }
                e = sum / npt;
                if (devmax <= dev)
                {
                    ratbest = rat;
                    //ratbest.CopyFrom(rat);
                    dev = devmax;
                }
                //Console.Write(" ratlsq iteration= ");
                //Console.Write(it);
                //Console.Write("  max error= ");
                //Console.Write("{0,10}", devmax);
                //Console.Write("{0}", "\n");
            }
            return ratbest;
        }

    }
}
 

2 代码格式

using System;namespace Legalsoft.Truffer
{public class Ratfn{private double[] cofs { get; set; }private int nn { get; set; }private int dd { get; set; }public Ratfn(double[] num, double[] den){this.cofs = new double[num.Length + den.Length - 1];this.nn = num.Length;this.dd = den.Length;for (int j = 0; j < nn; j++){cofs[j] = num[j] / den[0];}for (int j = 1; j < dd; j++){cofs[j + nn - 1] = den[j] / den[0];}}public Ratfn(double[] coffs, int n, int d){this.cofs = Globals.CopyFrom(coffs);this.nn = n;this.dd = d;}public double get(double x){double sumn = 0.0;double sumd = 0.0;for (int j = nn - 1; j >= 0; j--){sumn = sumn * x + cofs[j];}for (int j = nn + dd - 2; j >= nn; j--){sumd = sumd * x + cofs[j];}return sumn / (1.0 + x * sumd);}public static Ratfn pade(double[] cof){int n = (cof.Length - 1) / 2;double[,] q = new double[n, n];double[,] qlu = new double[n, n];double[] x = new double[n];double[] y = new double[n];for (int j = 0; j < n; j++){y[j] = cof[n + j + 1];for (int k = 0; k < n; k++){q[j, k] = cof[j - k + n];}}LUdcmp lu = new LUdcmp(q);lu.solve( y,  x);for (int j = 0; j < 4; j++){lu.mprove(y,  x);}for (int k = 0; k < n; k++){double sum = cof[k + 1];for (int j = 0; j <= k; j++){sum -= x[j] * cof[k - j];}y[k] = sum;}double[] num = new double[n + 1];double[] denom = new double[n + 1];num[0] = cof[0];denom[0] = 1.0;for (int j = 0; j < n; j++){num[j + 1] = y[j];denom[j + 1] = -x[j];}return new Ratfn(num, denom);}public static Ratfn ratlsq(UniVarRealValueFun fn, double a, double b, int mm, int kk, ref double dev){const int NPFAC = 8;const int MAXIT = 5;const double BIG = 1.0e99;const double PIO2 = 1.570796326794896619;int ncof = mm + kk + 1;int npt = NPFAC * ncof;double[] bb = new double[npt];double[] coff = new double[ncof];double[] ee = new double[npt];double[] fs = new double[npt];double[] wt = new double[npt];double[] xs = new double[npt];double[,] u = new double[npt, ncof];Ratfn ratbest = new Ratfn(coff, mm + 1, kk + 1);dev = BIG;for (int i = 0; i < npt; i++){if (i < (npt / 2) - 1){double hth = PIO2 * i / (npt - 1.0);xs[i] = a + (b - a) * Globals.SQR(Math.Sin(hth));}else{double hth = PIO2 * (npt - i) / (npt - 1.0);xs[i] = b - (b - a) * Globals.SQR(Math.Sin(hth));}fs[i] = fn.funk(xs[i]);wt[i] = 1.0;ee[i] = 1.0;}double e = 0.0;for (int it = 0; it < MAXIT; it++){for (int i = 0; i < npt; i++){double power = wt[i];bb[i] = power * (fs[i] + Globals.SIGN(e, ee[i]));for (int j = 0; j < mm + 1; j++){u[i, j] = power;power *= xs[i];}power = -bb[i];for (int j = mm + 1; j < ncof; j++){power *= xs[i];u[i, j] = power;}}SVD svd = new SVD(u);svd.solve(bb,  coff);double devmax = 0.0;double sum = 0.0;Ratfn rat = new Ratfn(coff, mm + 1, kk + 1);for (int j = 0; j < npt; j++){ee[j] = rat.get(xs[j]) - fs[j];wt[j] = Math.Abs(ee[j]);sum += wt[j];if (wt[j] > devmax){devmax = wt[j];}}e = sum / npt;if (devmax <= dev){ratbest = rat;//ratbest.CopyFrom(rat);dev = devmax;}//Console.Write(" ratlsq iteration= ");//Console.Write(it);//Console.Write("  max error= ");//Console.Write("{0,10}", devmax);//Console.Write("{0}", "\n");}return ratbest;}}
}

http://www.lryc.cn/news/230321.html

相关文章:

  • 排序算法之-快速
  • [vim]Python编写插件学习笔记2 - 分离
  • 【已解决】ModuleNotFoundError: No module named ‘kornia‘
  • 预览PDF并显示当前页数
  • 阿里云优惠券介绍、作用、领取入口及使用教程
  • Shell编程--流程控制
  • 设计模式-模板方法模式(Template Method)
  • 远程登录Linux方法(Linux平台相互远程;Windows远程登录Linux、远程编码、文件传输;无法远程登录的问题解决;c程序的编译)
  • macOS 13.6 及后续系统安装 Asahi Linux 将破坏引导
  • Python武器库开发-flask篇之flask框架的安装(二十一)
  • 【CASS精品教程】打开cass提示base.dcl未找到文件的解决办法
  • [vim]Python编写插件学习笔记3 - 命令行参数
  • 【仙逆】王林400年晋升元婴,复仇藤化元杀尽藤姓,高老畏罪自裁
  • 云原生实战课大纲
  • 数据湖架构
  • Zabbix 5.0部署(centos7+server+MySQL+Apache)
  • YOLO改进系列之注意力机制(CloAttention模型介绍)
  • openssl+AES开发实例(linux)
  • FreeRTOS源码阅读笔记3--queue.c
  • 云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统
  • java读取OPC DA数据---Utgard
  • 在 Android 上简单安全地登录——使用凭证管理器和密钥
  • 【Python】上市公司数据进行经典OLS回归实操
  • 科研学习|科研软件——有序多分类Logistic回归的SPSS教程!
  • 微服务简单理解与快速搭建
  • QColorDialog开发实例
  • linux实现全局快捷键
  • 共享台球室小程序系统:智能化预约与管理
  • 百度文心一言
  • 225.用队列实现栈(LeetCode)