C#,数值计算——插值和外推,Base_interp的计算方法与源程序

1 文本格式

using System;

namespace Legalsoft.Truffer

{

/// <summary>

/// Abstract base class used by all interpolation routines in this chapter.

/// Only the routine interp is called directly by the user.

/// </summary>

public abstract class Base_interp

{

public int n { get; set; }

public int mm { get; set; }

public int jsav { get; set; }

public int cor { get; set; }

public int dj { get; set; }

public double\[\] xx { get; set; }

public double\[\] yy { get; set; }

/// <summary>

/// Set up for interpolating on a table of x's and y's of length m. Normally

/// called by a derived class, not by the user.

/// </summary>

/// <param name="x"></param>

/// <param name="y"></param>

/// <param name="m"></param>

public Base_interp(double\[\] x, double y, int m)

{

this.n = x.Length;

this.mm = m;

this.jsav = 0;

this.cor = 0;

this.xx = x;

this.yy = new doublex.Length;

for (int i = 0; i < yy.Length; i++)

{

yyi = y;

}

dj = Math.Max(1, (int)Math.Pow((double)n, 0.25));

}

public double interp(double x)

{

int jlo = (cor != 0) ? hunt(x) : locate(x);

return rawinterp(jlo, x);

}

/// <summary>

/// Given a value x, return a value j such that x is (insofar as possible)

/// centered in the subrange xxj..j + mm - 1, where xx is the stored pointer.

/// The values in xx must be monotonic, either increasing or decreasing.

/// The returned value is not less than 0, nor greater than n-1.

/// </summary>

/// <param name="x"></param>

/// <returns></returns>

/// <exception cref="Exception"></exception>

public int locate(double x)

{

if (n < 2 || mm < 2 || mm > n)

{

throw new Exception("locate size error");

}

bool ascnd = (xxn - 1 >= xx0);

int jl = 0;

int ju = n - 1;

while (ju - jl > 1)

{

int jm = (ju + jl) >> 1;

if (x >= xxjm == ascnd)

{

jl = jm;

}

else

{

ju = jm;

}

}

cor = Math.Abs(jl - jsav) > dj ? 0 : 1;

jsav = jl;

return Math.Max(0, Math.Min(n - mm, jl - ((mm - 2) >> 1)));

}

/// <summary>

/// Given a value x, return a value j such that x is (insofar as possible)

/// centered in the subrange xxj..j + mm - 1, where xx is the stored pointer.

/// The values in xx must be monotonic, either increasing or decreasing.

/// The returned value is not less than 0, nor greater than n-1.

/// </summary>

/// <param name="x"></param>

/// <returns></returns>

/// <exception cref="Exception"></exception>

public int hunt(double x)

{

int jl = jsav;

int inc = 1;

if (n < 2 || mm < 2 || mm > n)

{

throw new Exception("hunt size error");

}

bool ascnd = (xxn - 1 >= xx0);

int ju;

if (jl < 0 || jl > n - 1)

{

jl = 0;

ju = n - 1;

}

else

{

if (x >= xxjl == ascnd)

{

for (; ; )

{

ju = jl + inc;

if (ju >= n - 1)

{

ju = n - 1;

break;

}

else if (x < xxju == ascnd)

{

break;

}

else

{

jl = ju;

inc += inc;

}

}

}

else

{

ju = jl;

for (; ; )

{

jl = jl - inc;

if (jl <= 0)

{

jl = 0;

break;

}

else if (x >= xxjl == ascnd)

{

break;

}

else

{

ju = jl;

inc += inc;

}

}

}

}

while (ju - jl > 1)

{

int jm = (ju + jl) >> 1;

if (x >= xxjm == ascnd)

{

jl = jm;

}

else

{

ju = jm;

}

}

cor = Math.Abs(jl - jsav) > dj ? 0 : 1;

jsav = jl;

return Math.Max(0, Math.Min(n - mm, jl - ((mm - 2) >> 1)));

}

public abstract double rawinterp(int jlo, double x);

}

}

2 代码格式

cs 复制代码
using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Abstract base class used by all interpolation routines in this chapter.
    /// Only the routine interp is called directly by the user.
    /// </summary>
    public abstract class Base_interp
    {
        public int n { get; set; }
        public int mm { get; set; }
        public int jsav { get; set; }
        public int cor { get; set; }
        public int dj { get; set; }
        public double[] xx { get; set; }
        public double[] yy { get; set; }

        /// <summary>
        /// Set up for interpolating on a table of x's and y's of length m. Normally
        /// called by a derived class, not by the user.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="m"></param>
        public Base_interp(double[] x, double y, int m)
        {
            this.n = x.Length;
            this.mm = m;
            this.jsav = 0;
            this.cor = 0;
            this.xx = x;
            this.yy = new double[x.Length];
            for (int i = 0; i < yy.Length; i++)
            {
                yy[i] = y;
            }
            dj = Math.Max(1, (int)Math.Pow((double)n, 0.25));
        }

        public double interp(double x)
        {
            int jlo = (cor != 0) ? hunt(x) : locate(x);
            return rawinterp(jlo, x);
        }

        /// <summary>
        /// Given a value x, return a value j such that x is (insofar as possible)
        /// centered in the subrange xx[j..j + mm - 1], where xx is the stored pointer.
        /// The values in xx must be monotonic, either increasing or decreasing.
        /// The returned value is not less than 0, nor greater than n-1.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public int locate(double x)
        {
            if (n < 2 || mm < 2 || mm > n)
            {
                throw new Exception("locate size error");
            }
            bool ascnd = (xx[n - 1] >= xx[0]);
            int jl = 0;
            int ju = n - 1;
            while (ju - jl > 1)
            {
                int jm = (ju + jl) >> 1;
                if (x >= xx[jm] == ascnd)
                {
                    jl = jm;
                }
                else
                {
                    ju = jm;
                }
            }
            cor = Math.Abs(jl - jsav) > dj ? 0 : 1;
            jsav = jl;
            return Math.Max(0, Math.Min(n - mm, jl - ((mm - 2) >> 1)));
        }

        /// <summary>
        /// Given a value x, return a value j such that x is (insofar as possible)
        /// centered in the subrange xx[j..j + mm - 1], where xx is the stored pointer.
        /// The values in xx must be monotonic, either increasing or decreasing.
        /// The returned value is not less than 0, nor greater than n-1.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public int hunt(double x)
        {
            int jl = jsav;
            int inc = 1;
            if (n < 2 || mm < 2 || mm > n)
            {
                throw new Exception("hunt size error");
            }
            bool ascnd = (xx[n - 1] >= xx[0]);
            int ju;
            if (jl < 0 || jl > n - 1)
            {
                jl = 0;
                ju = n - 1;
            }
            else
            {
                if (x >= xx[jl] == ascnd)
                {
                    for (; ; )
                    {
                        ju = jl + inc;
                        if (ju >= n - 1)
                        {
                            ju = n - 1;
                            break;
                        }
                        else if (x < xx[ju] == ascnd)
                        {
                            break;
                        }
                        else
                        {
                            jl = ju;
                            inc += inc;
                        }
                    }
                }
                else
                {
                    ju = jl;
                    for (; ; )
                    {
                        jl = jl - inc;
                        if (jl <= 0)
                        {
                            jl = 0;
                            break;
                        }
                        else if (x >= xx[jl] == ascnd)
                        {
                            break;
                        }
                        else
                        {
                            ju = jl;
                            inc += inc;
                        }
                    }
                }
            }
            while (ju - jl > 1)
            {
                int jm = (ju + jl) >> 1;
                if (x >= xx[jm] == ascnd)
                {
                    jl = jm;
                }
                else
                {
                    ju = jm;
                }
            }
            cor = Math.Abs(jl - jsav) > dj ? 0 : 1;
            jsav = jl;
            return Math.Max(0, Math.Min(n - mm, jl - ((mm - 2) >> 1)));
        }

        public abstract double rawinterp(int jlo, double x);

    }
}
相关推荐
ttod_qzstudio2 分钟前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
罗西的思考16 分钟前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX1 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
萧瑟余晖1 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
爱跳舞的烤冷面2 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号2 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽2 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI2 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
北域码匠3 小时前
PID 控制算法完整详解(C# 原生实现,无第三方库)
c#·pid控制·工控开发·闭环控制·自动控制算法·数字pid·增量式pid
离陌在学C#4 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#