Math 给定曲线上某一点的值,如何近似曲线上其他点的值

Math 给定曲线上某一点的值,如何近似曲线上其他点的值,math,curve-fitting,curve,discrete-mathematics,calculus,Math,Curve Fitting,Curve,Discrete Mathematics,Calculus,我有一个曲线图的趋势,它的方程我不知道,它在xy平面上绘制,其中x表示1到96的时间(代表15分钟的周期),y表示给定x的值。我在给定的x上得到y的值,比如(4,30)。现在我需要追踪曲线,找到所有其他x的y值 你知道如何用微积分来实现吗?我该如何编程 我正在尝试使用切线,但我不能完全想清楚 示例:假设我使用x,y值绘制一个图,它将是一条不对称曲线。现在,一旦绘制了曲线。同一条曲线可用于近似显示相同曲线趋势的不同数据集上的值。所以,如果只给我一个点,比如说,在x=10时,y=40,那么对于显示类

我有一个曲线图的趋势,它的方程我不知道,它在xy平面上绘制,其中x表示1到96的时间(代表15分钟的周期),y表示给定x的值。我在给定的x上得到y的值,比如(4,30)。现在我需要追踪曲线,找到所有其他x的y值

你知道如何用微积分来实现吗?我该如何编程

我正在尝试使用切线,但我不能完全想清楚

示例:假设我使用x,y值绘制一个图,它将是一条不对称曲线。现在,一旦绘制了曲线。同一条曲线可用于近似显示相同曲线趋势的不同数据集上的值。所以,如果只给我一个点,比如说,在x=10时,y=40,那么对于显示类似曲线趋势的数据集,如何得到其他x的y值呢

1,6.81
2,5.516
3,6.088
4,8.025
5,6.89
6,9.98
7,8.511
8,8.458
9,8.172
10,8.467
11,10.294
12,11.106
13,10.517
14,7.905
15,8.141
16,9.608
17,8.774

基本上,您有两项任务:

  • 给定一组点,您正在寻找一个模型。
  • 模型的结构
  • 模型参数
  • 使用以前的模型,调整其参数,使其适合新点
  • 所以,一步一个脚印

    1。结构和参数

    这很难。你基本上有两个选择

  • 您可以手动选择结构,例如线性模型(即形式为
    y=a*x+b
    的方程)或多项式模型(即形式为
    y=c_n*x^n+c_n-1*x^n-1+…+c_0
    的方程),但您也必须选择
    n
    )。或者一个神经网络(你必须修复拓扑结构)

    如果您这样做,参数拟合就很容易(如果您有一个像我提到的那样健全的模型)。特别是线性和多项式模型的外观和外观

  • 让一些算法找到一个结构。如果你愿意留在神经网络的ralm中,你可以使用或。或者,如果您确实需要符号描述,您可以使用和类似的算法。或者,如果你想要一个多项式,但你不知道它的阶数,你可以试试其中的几个

  • 2。p仪表调谐到新数据

    好吧,为了让这项工作生效,你需要一个允许参数调整的模型,然后你需要足够的数据来调整模型。对于线性模型,这至少是2个点。对于多项式,次数等于次数+1(或系数的数量)

    如果你使用类似遗传编程的东西,你可能会运气不佳,因为它只是一个拟合的符号表达式,你不能使用某些参数进行调整,但你可以对整个表达式执行任何转换(例如,线性表达式或多项式…)。或者您可以使用GP的一个变体,称为多基因遗传编程(MATLAB中的一个实现是,它的参数可以调整)


    如果新数据少于模型所需的数据,则必须手动修复某些参数,例如,对于线性模型,可以说斜率保持不变,只拟合恒定部分。

    因此,这两个图形相同或缩放或相互移动?


    (x,y)
    成为您的通缉点
    x
    已知
    y
    未知
    (xx,yy)
    成为第二个图形/数据中的已知点
    让已知图成为源图

    因此:

  • 相同的图表


    在源数据
    (x0,y0)、(x1,y1)
    中查找最近的2个点,其中
    x0您可以应用遗传编程(GP)或其变体之一。我有一个简单易用的软件,名为Multi-Expression Programming X,用于发现此类函数。我已将您的数据加载到程序中,并已获得以下C函数:

    #include <math.h>
    #include <stdio.h>
    
    void mepx(double *x /*inputs*/, double *outputs)
    {
    //constants ...
      double constants[5];
      constants[0] = 0.429823;
      constants[1] = -0.327464;
      constants[2] = -0.389508;
      constants[3] = -0.315653;
    
    
    constants[4] = 0.166875;
    
      double prg[22];
      prg[0] = x[0];
      prg[1] = cos(prg[0]);
      prg[2] = constants[4];
      prg[3] = prg[0] + prg[1];
      prg[4] = pow(10, prg[1]);
      prg[5] = sin(prg[0]);
      prg[6] = -prg[1];
      prg[7] = constants[4];
      prg[8] = atan(prg[3]);
      prg[9] = prg[4] * prg[6];
      prg[10] = prg[5] > prg[9]?prg[5] : prg[9];
      prg[11] = prg[6] < prg[7]?prg[6] : prg[7];
      prg[12] = atan(prg[10]);
      prg[13] = tan(prg[4]);
      prg[14] = prg[13] - prg[12];
      prg[15] = x[0];
      prg[16] = prg[8] / prg[2];
      prg[17] = sin(prg[14]);
      prg[18] = prg[16] - prg[11];
      prg[19] = prg[18] + prg[17];
      prg[20] = prg[6] / prg[15];
      prg[21] = prg[19] - prg[20];
    
      outputs[0] = prg[21];
    }
    
    int main(void)
    {
    
    //example of utilization ...
    
      double x[1];
      x[0] = 1.000000;
    
      double outputs[1];
    
      mepx(x, outputs);
      printf("%lf", outputs[0]);
      getchar();
    }
    
    #包括
    #包括
    无效mepx(双*x/*输入*/,双*输出)
    {
    //常数。。。
    双常数[5];
    常数[0]=0.429823;
    常数[1]=-0.327464;
    常数[2]=-0.389508;
    常数[3]=-0.315653;
    常数[4]=0.166875;
    双prg[22];
    prg[0]=x[0];
    prg[1]=cos(prg[0]);
    prg[2]=常数[4];
    prg[3]=prg[0]+prg[1];
    prg[4]=功率(10,prg[1]);
    prg[5]=sin(prg[0]);
    prg[6]=-prg[1];
    prg[7]=常数[4];
    prg[8]=atan(prg[3]);
    prg[9]=prg[4]*prg[6];
    prg[10]=prg[5]>prg[9]?prg[5]:prg[9];
    prg[11]=prg[6]
    该函数的误差(与数据的距离)为0.32。如果使用程序的参数,可以获得更多


    你现在要做的是为函数提供其他输入(其他x),然后你会得到其他y。

    我会先问math.stackexchange.com我认为当你只知道一个点时,你找不到函数…什么曲线?以什么形式?(图像(光栅/向量?),点集…)添加您已添加的数据示例添加一个示例来解决我的问题。您不能用一个点“生成”函数。您至少需要两个点,但这还不够,您需要知道您的函数应该是什么样的(线性函数、多项式…)。一旦你有了这些,你就可以使用标准的机器学习技术将你选择的函数形式与数据相匹配。对于线性函数,使用线性回归很容易。对于多项式,通过转换输入,然后使用线性回归也很容易。
    #include <math.h>
    #include <stdio.h>
    
    void mepx(double *x /*inputs*/, double *outputs)
    {
    //constants ...
      double constants[5];
      constants[0] = 0.429823;
      constants[1] = -0.327464;
      constants[2] = -0.389508;
      constants[3] = -0.315653;
    
    
    constants[4] = 0.166875;
    
      double prg[22];
      prg[0] = x[0];
      prg[1] = cos(prg[0]);
      prg[2] = constants[4];
      prg[3] = prg[0] + prg[1];
      prg[4] = pow(10, prg[1]);
      prg[5] = sin(prg[0]);
      prg[6] = -prg[1];
      prg[7] = constants[4];
      prg[8] = atan(prg[3]);
      prg[9] = prg[4] * prg[6];
      prg[10] = prg[5] > prg[9]?prg[5] : prg[9];
      prg[11] = prg[6] < prg[7]?prg[6] : prg[7];
      prg[12] = atan(prg[10]);
      prg[13] = tan(prg[4]);
      prg[14] = prg[13] - prg[12];
      prg[15] = x[0];
      prg[16] = prg[8] / prg[2];
      prg[17] = sin(prg[14]);
      prg[18] = prg[16] - prg[11];
      prg[19] = prg[18] + prg[17];
      prg[20] = prg[6] / prg[15];
      prg[21] = prg[19] - prg[20];
    
      outputs[0] = prg[21];
    }
    
    int main(void)
    {
    
    //example of utilization ...
    
      double x[1];
      x[0] = 1.000000;
    
      double outputs[1];
    
      mepx(x, outputs);
      printf("%lf", outputs[0]);
      getchar();
    }