C#,数值计算——数据建模,数据拟合(Fitab,Fitting Data to a Straight Line将数据拟合为直线)的计算方法与源程序

编程入门 行业动态 更新时间:2024-10-09 17:26:24

C#,数值计算——<a href=https://www.elefans.com/category/jswz/34/1771445.html style=数据建模,数据拟合(Fitab,Fitting Data to a Straight Line将数据拟合为直线)的计算方法与源程序"/>

C#,数值计算——数据建模,数据拟合(Fitab,Fitting Data to a Straight Line将数据拟合为直线)的计算方法与源程序

1 文本格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Fitting Data to a Straight Line
    /// </summary>
    public class Fitab
    {
        private int ndata { get; set; }
        private double a { get; set; }
        public double b { get; set; }
        private double siga { get; set; }
        private double sigb { get; set; }
        private double chi2 { get; set; }
        private double q { get; set; }
        private double sigdat { get; set; }
        private double[] x { get; set; }
        private double[] y { get; set; }
        private double[] sig { get; set; }

        public Fitab(double[] xx, double[] yy, double[] ssig)
        {
            this.ndata = xx.Length;
            this.x = xx;
            this.y = yy;
            this.sig = ssig;
            this.chi2 = 0.0;
            this.q = 1.0;
            this.sigdat = 0.0;
            Gamma gam = new Gamma();

            double ss = 0.0;
            double sx = 0.0;
            double sy = 0.0;
            double st2 = 0.0;
            b = 0.0;
            for (int i = 0; i < ndata; i++)
            {
                double wt = 1.0 / Globals.SQR(sig[i]);
                ss += wt;
                sx += x[i] * wt;
                sy += y[i] * wt;
            }
            double sxoss = sx / ss;
            for (int i = 0; i < ndata; i++)
            {
                double t = (x[i] - sxoss) / sig[i];
                st2 += t * t;
                b += t * y[i] / sig[i];
            }
            b /= st2;
            a = (sy - sx * b) / ss;
            siga = Math.Sqrt((1.0 + sx * sx / (ss * st2)) / ss);
            sigb = Math.Sqrt(1.0 / st2);
            for (int i = 0; i < ndata; i++)
            {
                chi2 += Globals.SQR((y[i] - a - b * x[i]) / sig[i]);
            }
            if (ndata > 2)
            {
                q = gam.gammq(0.5 * (ndata - 2), 0.5 * chi2);
            }
        }

        public Fitab(double[] xx, double[] yy)
        {
            this.ndata = xx.Length;
            this.x = xx;
            this.y = yy;
            this.sig = xx;
            this.chi2 = 0.0;
            this.q = 1.0;
            this.sigdat = 0.0;

            double sx = 0.0;
            double sy = 0.0;
            double st2 = 0.0;
            b = 0.0;
            for (int i = 0; i < ndata; i++)
            {
                sx += x[i];
                sy += y[i];
            }
            double ss = ndata;
            double sxoss = sx / ss;
            for (int i = 0; i < ndata; i++)
            {
                double t = x[i] - sxoss;
                st2 += t * t;
                b += t * y[i];
            }
            b /= st2;
            a = (sy - sx * b) / ss;
            siga = Math.Sqrt((1.0 + sx * sx / (ss * st2)) / ss);
            sigb = Math.Sqrt(1.0 / st2);
            for (int i = 0; i < ndata; i++)
            {
                chi2 += Globals.SQR(y[i] - a - b * x[i]);
            }
            if (ndata > 2)
            {
                sigdat = Math.Sqrt(chi2 / (ndata - 2));
            }
            siga *= sigdat;
            sigb *= sigdat;
        }
    }
}
 

2 代码格式

using System;namespace Legalsoft.Truffer
{/// <summary>/// Fitting Data to a Straight Line/// </summary>public class Fitab{private int ndata { get; set; }private double a { get; set; }public double b { get; set; }private double siga { get; set; }private double sigb { get; set; }private double chi2 { get; set; }private double q { get; set; }private double sigdat { get; set; }private double[] x { get; set; }private double[] y { get; set; }private double[] sig { get; set; }public Fitab(double[] xx, double[] yy, double[] ssig){this.ndata = xx.Length;this.x = xx;this.y = yy;this.sig = ssig;this.chi2 = 0.0;this.q = 1.0;this.sigdat = 0.0;Gamma gam = new Gamma();double ss = 0.0;double sx = 0.0;double sy = 0.0;double st2 = 0.0;b = 0.0;for (int i = 0; i < ndata; i++){double wt = 1.0 / Globals.SQR(sig[i]);ss += wt;sx += x[i] * wt;sy += y[i] * wt;}double sxoss = sx / ss;for (int i = 0; i < ndata; i++){double t = (x[i] - sxoss) / sig[i];st2 += t * t;b += t * y[i] / sig[i];}b /= st2;a = (sy - sx * b) / ss;siga = Math.Sqrt((1.0 + sx * sx / (ss * st2)) / ss);sigb = Math.Sqrt(1.0 / st2);for (int i = 0; i < ndata; i++){chi2 += Globals.SQR((y[i] - a - b * x[i]) / sig[i]);}if (ndata > 2){q = gam.gammq(0.5 * (ndata - 2), 0.5 * chi2);}}public Fitab(double[] xx, double[] yy){this.ndata = xx.Length;this.x = xx;this.y = yy;this.sig = xx;this.chi2 = 0.0;this.q = 1.0;this.sigdat = 0.0;double sx = 0.0;double sy = 0.0;double st2 = 0.0;b = 0.0;for (int i = 0; i < ndata; i++){sx += x[i];sy += y[i];}double ss = ndata;double sxoss = sx / ss;for (int i = 0; i < ndata; i++){double t = x[i] - sxoss;st2 += t * t;b += t * y[i];}b /= st2;a = (sy - sx * b) / ss;siga = Math.Sqrt((1.0 + sx * sx / (ss * st2)) / ss);sigb = Math.Sqrt(1.0 / st2);for (int i = 0; i < ndata; i++){chi2 += Globals.SQR(y[i] - a - b * x[i]);}if (ndata > 2){sigdat = Math.Sqrt(chi2 / (ndata - 2));}siga *= sigdat;sigb *= sigdat;}}
}

更多推荐

C#,数值计算——数据建模,数据拟合(Fitab,Fitting Data to a Straight Line将数据拟合为直线)的计算方法与源程序

本文发布于:2024-03-13 01:08:57,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1732840.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据   源程序   建模   数值   计算方法

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!