C#,数值计算——数据建模Fitlin的计算方法与源程序

news2024/11/16 18:51:21

1 文本格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// General linear fit
    /// </summary>
    public class Fitlin
    {
        private int ndat { get; set; }
        private int ma { get; set; }
        private double[] x { get; set; }
        private double[] y { get; set; }
        private double[] sig { get; set; }
        private bool[] ia { get; set; }
        private double[] a { get; set; }
        private double[,] covar { get; set; }
        private double chisq { get; set; }

        public UniVarRealMultiValueFun funcs;

        public Fitlin(double[] xx, double[] yy, double[] ssig, UniVarRealMultiValueFun funks)
        {
            this.ndat = xx.Length;
            this.x = xx;
            this.y = yy;
            this.sig = ssig;
            this.funcs = funks;
            ma = funcs.funk(x[0]).Length;
            //a.resize(ma);
            a = new double[ma];
            //covar.resize(ma, ma);
            covar = new double[ma, ma];
            //ia.resize(ma);
            ia = new bool[ma];
            for (int i = 0; i < ma; i++)
            {
                ia[i] = true;
            }
        }

        public void hold(int i, double val)
        {
            ia[i] = false;
            a[i] = val;
        }

        public void free(int i)
        {
            ia[i] = true;
        }

        public void fit()
        {
            int mfit = 0;
            for (int j = 0; j < ma; j++)
            {
                if (ia[j])
                {
                    mfit++;
                }
            }
            if (mfit == 0)
            {
                throw new Exception("lfit: no parameters to be fitted");
            }
            double[,] temp = new double[mfit, mfit];
            double[,] beta = new double[mfit, 1];
            for (int i = 0; i < ndat; i++)
            {
                double[] afunc = funcs.funk(x[i]);
                double ym = y[i];
                if (mfit < ma)
                {
                    for (int j = 0; j < ma; j++)
                    {
                        if (!ia[j])
                        {
                            ym -= a[j] * afunc[j];
                        }
                    }
                }
                double sig2i = 1.0 / Globals.SQR(sig[i]);
                for (int j = 0, l = 0; l < ma; l++)
                {
                    if (ia[l])
                    {
                        double wt = afunc[l] * sig2i;
                        for (int k = 0, m = 0; m <= l; m++)
                        {
                            if (ia[m])
                            {
                                temp[j, k++] += wt * afunc[m];
                            }
                        }
                        beta[j++, 0] += ym * wt;
                    }
                }
            }
            for (int j = 1; j < mfit; j++)
            {
                for (int k = 0; k < j; k++)
                {
                    temp[k, j] = temp[j, k];
                }
            }

            GaussJordan.gaussj(temp, beta);

            for (int j = 0, l = 0; l < ma; l++)
            {
                if (ia[l])
                {
                    a[l] = beta[j++, 0];
                }
            }
            chisq = 0.0;
            for (int i = 0; i < ndat; i++)
            {
                double[] afunc = funcs.funk(x[i]);
                double sum = 0.0;
                for (int j = 0; j < ma; j++)
                {
                    sum += a[j] * afunc[j];
                }
                chisq += Globals.SQR((y[i] - sum) / sig[i]);
            }
            for (int j = 0; j < mfit; j++)
            {
                for (int k = 0; k < mfit; k++)
                {
                    covar[j, k] = temp[j, k];
                }
            }
            for (int i = mfit; i < ma; i++)
            {
                for (int j = 0; j < i + 1; j++)
                {
                    covar[i, j] = covar[j, i] = 0.0;
                }
            }
            int kk = mfit - 1;
            for (int j = ma - 1; j >= 0; j--)
            {
                if (ia[j])
                {
                    for (int i = 0; i < ma; i++)
                    {
                        Globals.SWAP(ref covar[i, kk], ref covar[i, j]);
                    }
                    for (int i = 0; i < ma; i++)
                    {
                        Globals.SWAP(ref covar[kk, i], ref covar[j, i]);
                    }
                    kk--;
                }
            }
        }
    }
}
 

2 代码格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// General linear fit
    /// </summary>
    public class Fitlin
    {
        private int ndat { get; set; }
        private int ma { get; set; }
        private double[] x { get; set; }
        private double[] y { get; set; }
        private double[] sig { get; set; }
        private bool[] ia { get; set; }
        private double[] a { get; set; }
        private double[,] covar { get; set; }
        private double chisq { get; set; }

        public UniVarRealMultiValueFun funcs;

        public Fitlin(double[] xx, double[] yy, double[] ssig, UniVarRealMultiValueFun funks)
        {
            this.ndat = xx.Length;
            this.x = xx;
            this.y = yy;
            this.sig = ssig;
            this.funcs = funks;
            ma = funcs.funk(x[0]).Length;
            //a.resize(ma);
            a = new double[ma];
            //covar.resize(ma, ma);
            covar = new double[ma, ma];
            //ia.resize(ma);
            ia = new bool[ma];
            for (int i = 0; i < ma; i++)
            {
                ia[i] = true;
            }
        }

        public void hold(int i, double val)
        {
            ia[i] = false;
            a[i] = val;
        }

        public void free(int i)
        {
            ia[i] = true;
        }

        public void fit()
        {
            int mfit = 0;
            for (int j = 0; j < ma; j++)
            {
                if (ia[j])
                {
                    mfit++;
                }
            }
            if (mfit == 0)
            {
                throw new Exception("lfit: no parameters to be fitted");
            }
            double[,] temp = new double[mfit, mfit];
            double[,] beta = new double[mfit, 1];
            for (int i = 0; i < ndat; i++)
            {
                double[] afunc = funcs.funk(x[i]);
                double ym = y[i];
                if (mfit < ma)
                {
                    for (int j = 0; j < ma; j++)
                    {
                        if (!ia[j])
                        {
                            ym -= a[j] * afunc[j];
                        }
                    }
                }
                double sig2i = 1.0 / Globals.SQR(sig[i]);
                for (int j = 0, l = 0; l < ma; l++)
                {
                    if (ia[l])
                    {
                        double wt = afunc[l] * sig2i;
                        for (int k = 0, m = 0; m <= l; m++)
                        {
                            if (ia[m])
                            {
                                temp[j, k++] += wt * afunc[m];
                            }
                        }
                        beta[j++, 0] += ym * wt;
                    }
                }
            }
            for (int j = 1; j < mfit; j++)
            {
                for (int k = 0; k < j; k++)
                {
                    temp[k, j] = temp[j, k];
                }
            }

            GaussJordan.gaussj(temp, beta);

            for (int j = 0, l = 0; l < ma; l++)
            {
                if (ia[l])
                {
                    a[l] = beta[j++, 0];
                }
            }
            chisq = 0.0;
            for (int i = 0; i < ndat; i++)
            {
                double[] afunc = funcs.funk(x[i]);
                double sum = 0.0;
                for (int j = 0; j < ma; j++)
                {
                    sum += a[j] * afunc[j];
                }
                chisq += Globals.SQR((y[i] - sum) / sig[i]);
            }
            for (int j = 0; j < mfit; j++)
            {
                for (int k = 0; k < mfit; k++)
                {
                    covar[j, k] = temp[j, k];
                }
            }
            for (int i = mfit; i < ma; i++)
            {
                for (int j = 0; j < i + 1; j++)
                {
                    covar[i, j] = covar[j, i] = 0.0;
                }
            }
            int kk = mfit - 1;
            for (int j = ma - 1; j >= 0; j--)
            {
                if (ia[j])
                {
                    for (int i = 0; i < ma; i++)
                    {
                        Globals.SWAP(ref covar[i, kk], ref covar[i, j]);
                    }
                    for (int i = 0; i < ma; i++)
                    {
                        Globals.SWAP(ref covar[kk, i], ref covar[j, i]);
                    }
                    kk--;
                }
            }
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目管理必备的22个公式

大家好&#xff0c;我是老原。 趁着国庆时间比较空闲&#xff0c;给你们整理了一些项目管理必备的计算公式&#xff0c;一共22个。 每一个公式都给你们标注了适用情况和使用方法&#xff0c;为了方便你们理解&#xff0c;也加了一些例子&#xff0c;保准你看了就会。 觉得不…

增强基于Cortex-M3的MCU以处理480 Mbps高速USB

通用串行总线&#xff08;USB&#xff09;完全取代了PC上的UART&#xff0c;PS2和IEEE-1284并行接口&#xff0c;现在已在嵌入式开发应用程序中得到广泛认可。嵌入式开发系统使用的大多数I / O设备&#xff08;键盘&#xff0c;扫描仪&#xff0c;鼠标&#xff09;都是基于USB的…

MySQL数据库基本操作-DQL-聚合查询

简介 使用聚合函数查询是纵向查询&#xff0c;它是对一列的值进行计算&#xff0c;然后返回一个单一的值&#xff1b;另外聚合函数会忽略空值。 字段说明&#xff1a; product 是一个表pname 是商品名price 是 价格category_id 是分类 -- 1 查询商品的总条数 select count(…

Ubuntu20.04系统安装cuda11.3

在官网下载cuda进行安装&#xff1a; 官网链接&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 再官网版本中选择需要的版本&#xff0c;本身需要cuda11.3 cuda版本选择后&#xff0c;选择系统信息后复制命令进行下载&#xff08;我是ubuntu20.04,aarch64 架构&#xf…

清华智谱AI大模型ChatGLM-Pro申请开通教程

清华智谱AI大模型ChatGLM-Pro申请开通教程 ChatGLM系列模型&#xff0c;包括ChatGLM-130B和ChatGLM-6B模型&#xff0c;支持相对复杂的自然语言指令&#xff0c;并且能够解决困难的推理类问题。其中&#xff0c;ChatGLM-6B模型吸引了全球超过 160 万人下载安装&#xff0c;该模…

磷矿石和磷精矿中氧化镁含量的测定

声明 本文是学习GB-T 1871.5-2022 磷矿石和磷精矿中氧化镁含量的测定 火焰原子吸收光谱法、容量法和电感耦合等离子体发射光谱法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了在磷矿石和磷精矿中测定氧化镁含量的火焰原子吸收…

GRADIENT BASED THRESHOLD FREE COLOR FILTER ARRAY INTERPOLATION

ABSTRACT 彩色滤波器阵列(CFA)插值是单传感器数字相机图像处理管道的组成部分。多年来&#xff0c;许多CFA算法被提出以提高图像质量。其中一个算法就是非常成功的定向线性最小均方误差估计(Directional Linear Minimum Mean-Square Error Estimation, DLMMSE)方法。我们对该算…

JavaScript使用throw new Error自定义错误信息

有些时候 我们自己写了一个组件 但是怕同事不了解我们的组件 传入了错误的类型或者数据 导致逻辑报错 同事还会觉得我们的组件写的莫名其妙 我们就可以自己写判断 例如我这个代码 我判断 如果同事传入的 type 为 false 或者 在我自己的集合中找不到 外面传入的type类型 我就直…

【G-LAB】带你掌握网络交换机上各种接口知识

点击上方关注我们 交换机是一种用于电&#xff08;光&#xff09;信号转发的网络设备。可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。其他常见的还有电话语音交换机、光纤交换机等。交换机是使用非常广泛的网络设备。多台网络设备…

十五、异常(7)

本章概要 其他可选方式 历史观点把异常传递给控制台把“检查的异常”转换为“不检查的异常” 异常指南 其他可选方式 异常处理系统就像一个活门&#xff08;trap door&#xff09;&#xff0c;使你能放弃程序的正常执行序列。当“异常情形”发生的时候&#xff0c;正常的执行…

【Redis】Hash 哈希内部编码方式

Hash 哈希内部编码方式 哈希的内部编码有两种&#xff1a; ziplist&#xff08;压缩列表&#xff09;&#xff1a;当哈希类型元素个数⼩于hash-max-ziplist-entries配置&#xff08;默认512个&#xff09;、同时所有值都⼩于hash-max-ziplist-value配置&#xff08;默认64字节…

软考高级架构师下篇-18

目录 1. 引言2. 传统数据处理系统的问题1.传统数据库的数据过载问题2.大数据的特点3.大数据利用过程4.大数据处理系统架构分析3.典型的大数据架构1. Lambda架构2.Kappa架构3. Lambda架构与Kappa架构的对比4.大数据架构的实践1.大规模视频网络2.广告平台3.公司智能决策大数据系统…

微信小程序 在bindscroll事件中监听scroll-view滚动到底

scroll-view其实提供了一个 bindscrolltolower 事件 这个事件的作用是直接监听scroll-view滚动到底部 但是 总有不太一样的情况 公司的项目 scroll-view 内部 最下面有一个 类名叫 bottombj 的元素 我希望 滚动到这个 bottombj 上面的时候就开始加载滚动分页 简单说 bottombj这…

LeetCode【84】柱状图中的最大矩形

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/qq_28468707/article/details/103682528 https://www.jianshu.com/p/2b9a36a548fa 清晰 代码&#xff1a; public int largestRectangleArea(int[] heights) {int[] heightadd new int[heights.length 1];for (i…

电机控制——PID基础

本文来讲一下PID调节器。 在实际的系统中&#xff0c;因为摩擦、阻力等外界因素的存在&#xff0c;系统的实际输出与我们期望的输出通常存在误差&#xff0c;PID的目的就是调节系统的实际输出&#xff0c;使其更快更稳地贴近期望输出。 PID模块被周期性的调用&#xff0c;模块…

电脑资源:分享9个免费下载音乐网站,值得收藏!

目录 1、中国原创音乐基地 2、soundstripe 3、My Free MP3 4、钟铜 5、cctrax 国外流行音乐专辑 6、歌曲宝 7、搜无损网 8、音乐搜索器 9、Listen 1 今天给大家分享9个免费下载音乐网站&#xff0c;值得收藏&#xff01; 1、中国原创音乐基地 一个国内原创音乐基地网站&…

中国人民大学与加拿大女王大学金融硕士——山有顶峰,海有彼岸,一切终有回甘

每个人都有自己独特的天赋和潜力&#xff0c;只需要用心去发掘和发挥。相信自己&#xff0c;努力奋斗&#xff0c;成功才会属于你。对于工作多年的在职人士来说&#xff0c;瓶颈期是再正常不过了&#xff0c;但是想要打破瓶颈期&#xff0c;就需要不断学习&#xff0c;提升自己…

带你一张图了解八种流行的网络协议

网络协议是在网络中两台计算机之间传输数据的标准方法。 本文将通过一张图详解 8 种流行的网络协议。 1、HTTP&#xff08;超文本传输协议&#xff09;&#xff0c;HTTP 是一种用于获取 HTML 文档等资源的协议。它是 Web 上任何数据交换的基础&#xff0c;是一种客户端 - 服务…

拓扑几何学

目录 一&#xff0c;欧拉定理 1&#xff0c;平面图论图 2&#xff0c;单连通多面体 3&#xff0c;一般多面体 一&#xff0c;欧拉定理 1&#xff0c;平面图论图 在一个联通无向图中&#xff0c;点数-边数面数 1 如&#xff1a; 7-126 1 如果把最外面的五边形外面也算…

狂飙10年后,电动两轮车终究要回归理性

文&#xff5c;新熔财经 作者&#xff5c;一城 我国电动两轮车保有量超3.7亿辆&#xff0c;并超越汽车保有量成为中国第一大交通工具&#xff0c;电动两轮车“国民级产品”当之无愧。 但是&#xff0c;历经近十年的高速发展&#xff0c;行业却面临一些问题&#xff1a; 渠道…