二分法-线性 插值

这个程序实现了一个模板函数`bisectionInterp`,它使用二分法进行线性插值。给定一个有序数组`keys`和对应的`values`,以及目标键值`key`,函数计算并返回对应的目标值。在主函数中,数组`keys`和`values`分别用整数从0到179表示弧度,并计算对应的正弦值。然后,针对键值`key=23.5`,应用二分法插值找到相应的正弦值并输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <cmath>
using namespace std;

template <class T>
bool bisectionInterp(T keys[], T values[], int len, T key, T &value)
{
    //数组是由小到大排列的
    //超出界限直接返回false
    if(key<keys[0] || key>keys[len-1]) return false;
    int start, ending;
    ending = len - 1;
    start = 0;
    int middle = len/2;

    while(ending >= start)
    {
        //在两个数之间,差值求结果
        if(ending - start == 1)
        {
            value = (key - keys[start]) / (keys[ending] - keys[start]) *
            (values[ending] - values[start]) + values[start];
            return true;
        }
        //恰好等于键值,直接赋值
        middle = (ending + start)/2;
        if(keys[middle] == key)
        {
            value = values[middle];
            return true;
        }

        if(keys[middle] > key)
            ending = middle;         //前提是假设数组是从小到大排序,否则不确定是该加1还是减1
        else if(keys[middle] < key )
            start = middle;
    }
    return (-1);

}
int main()
{
    double keys[180], values[180];
    double key=23.5, value;
    for(int i=0; i<180; ++i)
    {
        keys[i] = double(i);
        values[i] = sin(double(i)/180.0*3.1415926);
    }
    bisectionInterp(keys, values, 180, key, value);
    cout << value << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值