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;
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/147079.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编辑器vim和编译器gcc/g++

目录 一、编辑器vim 1、概念 2、基本操作 1、进入vim 2、模式切换 3、命令行模式 4、插入模式 5、底行模式 6、vim 的配置 二、编译器gcc/g 1、概念 2、背景知识 3、gcc/g中的编译链接 1、预处理 2、编译 3、汇编 4、链接 4、函数库 1、静态库 2、动态库 一…

服务器数据恢复—服务器发生故障导致数据丢失如何恢复服务器数据?

服务器常见故障&#xff1a; 硬件故障&#xff1a;磁盘、板卡、电源故障等。 软件故障&#xff1a;操作系统崩溃、程序运行错误等。 入侵破坏&#xff1a;加密、删除服务数据等。 不可控力&#xff1a;浸水、火烧、倒塌等。 误操作&#xff1a;格式化、删除、覆盖等。 如何减少…

详解[ZJCTF 2019]NiZhuanSiWei 1(PHP两种伪协议、PHP反序列化漏洞、PHP强比较)还有那道题有这么经典?

题目环境&#xff1a; <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")){echo "<br><h1>&…

WebStorm配置less编译wxss或css

文章目录 前言先下载安装less程序&#xff1a;实参&#xff1a;要刷新的输出路径成功 前言 使用WebStorm写微信小程序&#xff0c;wxss写着很麻烦&#xff0c;就想着用less&#xff0c;接下来是配置less编译 先下载安装less npm install -g lessless会安装在你当前目录下(以D…

虹科示波器 | 汽车免拆检修 | 2014款保时捷卡宴车行驶中发动机偶尔自动熄火

一、故障现象 一辆2014款保时捷卡宴车&#xff0c;搭载4.8L自然吸气发动机&#xff0c;累计行驶里程约为10.3万km。车主反映&#xff0c;行驶中发动机偶尔自动熄火&#xff0c;尤其在减速至停车的过程中故障容易出现。 二、故障诊断 接车后路试&#xff0c;确认故障现象与车主所…

caspp attacker lab

attacker lab phase2 advice phase 1 ctarget 会先调用test , test调用getbuf, getbuf调用Get。 任务目的是通过缓冲区注入攻击&#xff0c;将函数getbuf返回直接重定向到函数touch1。 0x28 是 40 比特&#xff0c; gdb ./ctarget getbuf 下一次执行的指令是401976, rsp对…

Vue快速入门

目录 一、概述 环境准备 前置知识 JavaScript-导入导出 默认导入导出 二、局部使用Vue 1、使用步骤 准备工作 构建用户界面 2、常用指令 v-for v-bind v-if & v-show v-on v-model 3、生命周期 三、Axios 使用案例1 测试 使用案例2 测试 请求方式别名…

ARMday06(总线、串口、RCC章节分析)

总线 总线是完成各个部件之间传输的一种媒介 串行/并行总线 串行总线&#xff0c; 在同一时刻&#xff0c;根据时钟线的变化&#xff0c;只可以收发一位数据 优点&#xff1a;占用引脚资源少 缺点&#xff1a;传输速度比较慢 并行总线&#xff0c; 在同一时刻&#xff…

vscode设置vue3代码格式化

vscode设置vue3代码格式化 vscode设置vue3代码格式化 下载插件设置格式化时选用的插件实际使用 使用Prettier默认配置使用Prettier添加自定义配置使用Volar 完整配置文件参考链接 下载插件 可以使用Volar或Prettier 设置格式化时选用的插件 mac&#xff1a;【shift】【op…

基于单片机微波炉加热箱系统设计

**单片机设计介绍&#xff0c; 基于单片机微波炉加热箱系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的微波炉加热箱系统是一种智能化的厨房电器设备&#xff0c;利用单片机控制技术实现自动加热和定时等功能…

医疗行业创新:低代码工具推动业务自动化和智能化

随着科技的不断发展&#xff0c;数字化已经成为各个领域的必然趋势。同样&#xff0c;在医疗领域&#xff0c;数字化转型也已经成为必要性。 早在新冠疫情之前很多国家和地区就已经开始尝试医疗数字化的转型。有很多人认为&#xff0c;医疗数字化在未来不是锦上添花&#xff0…

【开源】基于JAVA的电子元器件管理系统

目录 一、摘要1.1 项目简介1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录&注册&主页3.2 元器件单位模块3.3 元器件仓库模块3.4 元器件供应商模块3.5 元器件品类模块3.6 元器件明细模块3.7 元器件类型模块3.8 元器件采购模块3.9 元器件领用模块3.10 系统基础模块 …

C语言精选练习题:(9)找出盗窃者

每日一言 世界灿烂盛大&#xff0c;欢迎回家。 题目 某地发生了一件盗窃案&#xff0c;警察通过排查确定盗窃者必为4个嫌疑人的一个 以下为4个嫌疑人的供词&#xff1a; a说&#xff1a;不是我 b说&#xff1a;是c c说&#xff1a;是d d说&#xff1a;c在胡说 已知3个人说了真…

安装virt-manger虚拟机管理器

环境&#xff1a; redhat7:192.168.1.130 安装步骤&#xff1a; 安装qemu-kvm yum install -y qemu-kvm安装libvirt yum install -y libvirt重启libvirt systemctl restart libvirtd查看libvirt的版本信息 virsh version安装virt-manager yum install -y virt-manager检验…

Vue3 Computed属性

一、引入computed import { computed } from vue; 二、计算属性的使用 &#xff08;一&#xff09;计算属性简写形式 计算属性 computed( ()> { return 计算属性值 }) setup() {let nums reactive({ten: 0, // 十位unit: 0, // 个位});nums.sum computed(() > {re…

基础课1——智能客服的定义

1.介绍 智能客服是一种采用人工智能技术的客户服务方式&#xff0c;它通过语音识别、自然语言处理、语义理解等技术&#xff0c;实现了与客户的自动交互。智能客服可以提供客户24小时不间断的服务&#xff0c;帮助客户快速解决问题&#xff0c;提高客户满意度。智能客服的应用…

No208.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

安全好用性价比高的远程协同运维软件有吗?

据悉不少IT专业人员认为&#xff0c;远程运维风险性更高&#xff0c;更容易给企业带来更大的风险。所以不少运维人员都在求一款安全好用性价比高的远程协同运维软件&#xff0c;因为下班需要&#xff0c;因为碰到IT难题时候需要&#xff0c;因为驻场需要。那你知道市面上安全好…

spring cloud之服务熔断

四、Hystrix组件(*) - 官网&#xff1a;https://github.com/Netflix/Hystrix - 在分布式环境中&#xff0c;许多服务依赖项不可避免的会失败。Hystrix是一个库&#xff0c;它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点…

【计算思维】少儿编程蓝桥杯青少组计算思维题考试真题及解析C

【科技素养】少儿编程蓝桥杯青少组计算思维题考试真题及解析 1.天平的左右两端分别放有一些砝码&#xff0c;如下图所示&#xff0c;右边的砝码不变&#xff0c;从左边最多拿走几个砝码&#xff0c;可以使天平左右两边平衡&#xff1a; A、1 B、2 C、3 D、4 2.把下面的图形…