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

时间:2015-07-09 06:06:32

标签: math curve-fitting curve discrete-mathematics calculus

我有一个图的趋势,其方程式我不知道,它在xy平面上绘制,其中x表示时间,1到96(表示15分钟周期),y表示给定x的值。在给定的x说(4,30)时给出y的值。现在我需要跟踪曲线并找到所有其他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

3 个答案:

答案 0 :(得分:1)

所以两张图相同或相互缩放或移位?


(x,y)成为您想要的点x已知y未知
(xx,yy)成为第二个图/数据中的已知点
将已知图形作为源图

example

所以:

  1. 相同的图表

    在源数据(x0,y0),(x1,y1)中找到最接近的2个点x0<=xx<x1。例如,通过线性插值在它们之间插值:

    y=y0+(y1-y0)*(x-x0)/(x1-x0)
    
  2. 缩放图表

    计算缩放后的源图,以便通过项目符号#1 yy'的源图中计算xx。比例m=yy/yy'所以yy=yy'*m现在只需通过项目符号#1 y'的源图表中计算x,然后转换为目标图表的比例y=y'*m {1}}

  3. 移动图表

    对于这些,你需要知道移位偏移或第二个图中的更多点。转换可以在xy轴上进行,因此您需要应用两个偏移更正xo,yo。要在图表之间转移y=y'+yox=x'+xo的位置。

    所以你找到y' (x-xo)然后y=y'+yo

  4. 缩放和移动图表

    只需将子弹#2,#3

  5. 组合起来

答案 1 :(得分:0)

基本上你有两个任务:

  1. 给定一组积分,您正在寻找一个模型。
    1. 模型的结构。
    2. 模型的参数。
  2. 使用以前的模型,调整其参数以使其适合新点。
  3. 所以,一步一步......

    <强> 1。结构和参数

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

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

      如果你这样做,参数拟合很容易(如果你有一个像我提到的那样的理智模型)。特别是对于线性和多项式模型,请查看herehere

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

    3. <强> 2。 Pameter调整到新数据

      嗯,要实现这一点,您需要一个允许参数调整的模型,然后您需要调整模型所需的足够数据。对于线性模型,这至少是2个点。对于多项式,数字等于+ 1(或系数)。

      如果你使用像遗传编程这样的东西,你可能运气不好,因为它只是一个合适的符号表达式,你无法使用某些参数进行调整,但你可以对整个表达式进行任何转换(例如线性表达式) ,或多项式......)。或者您可以使用GP的变体,称为多基因遗传编程(MATLAB中的实现是here,其中包含可以调整的参数。

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

答案 2 :(得分:0)

您可以应用遗传编程(GP)或其中一种变体。我有一个简单易用的软件,名为Multi Expression Programming X http://www.mepx.org,可以发现这些函数。我已经在程序中加载了数据,并且我已经获得了以下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();
}

该函数的错误(与数据的距离)为0.32。如果您使用该程序的参数,您可以获得更多。

您现在要做的是为函数提供其他输入(其他x),您将获得其他y。