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

}

}

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

    }
}
相关推荐
地平线开发者几秒前
征程 6X Camera 接入数据评估
算法·自动驾驶
Storynone3 分钟前
【Day23】LeetCode:455. 分发饼干,376. 摆动序列,53. 最大子序和
python·算法·leetcode
骇客野人10 分钟前
自己手搓磁盘清理工具(JAVA版)
java·开发语言
清风徐来QCQ16 分钟前
Java笔试总结一
java·开发语言
InCerry18 分钟前
C# .NET 周刊|2026年2月4期
c#·.net周报·.net周刊
lly20240619 分钟前
《jEasyUI 转换 HTML 表格为数据网格》
开发语言
小付同学呀21 分钟前
C语言学习(八)——C判断(switch语句)
c语言·学习·算法
萧曵 丶23 分钟前
LangChain Model IO 提示词模版(Python版)
开发语言·python·langchain
Elastic 中国社区官方博客24 分钟前
Elastic 为什么捐赠其 OpenTelemetry PHP 发行版
大数据·开发语言·elasticsearch·搜索引擎·信息可视化·全文检索·php
zhojiew33 分钟前
为agent实现渐进式Skills能力的思考和实践
linux·python·算法