我有一个图的趋势,其方程式我不知道,它在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
答案 0 :(得分:1)
所以两张图相同或相互缩放或移位?
让(x,y)
成为您想要的点x
已知y
未知
让(xx,yy)
成为第二个图/数据中的已知点
将已知图形作为源图
所以:
相同的图表
在源数据(x0,y0),(x1,y1)
中找到最接近的2个点x0<=x
和x<x1
。例如,通过线性插值在它们之间插值:
y=y0+(y1-y0)*(x-x0)/(x1-x0)
缩放图表
计算缩放后的源图,以便通过项目符号#1 从yy'
的源图中计算xx
。比例m=yy/yy'
所以yy=yy'*m
现在只需通过项目符号#1 从y'
的源图表中计算x
,然后转换为目标图表的比例y=y'*m
{1}}
移动图表
对于这些,你需要知道移位偏移或第二个图中的更多点。转换可以在x
和y
轴上进行,因此您需要应用两个偏移更正xo,yo
。要在图表之间转移y=y'+yo
和x=x'+xo
的位置。
所以你找到y'
(x-xo)
然后y=y'+yo
缩放和移动图表
只需将子弹#2,#3
答案 1 :(得分:0)
基本上你有两个任务:
所以,一步一步......
<强> 1。结构和参数
这很难。你基本上有两种选择。
您可以手动选择结构,例如线性模型(即形式y = a*x + b
的方程式)或多项式模型(即形式y = c_n * x^n + c_n-1 * x^n - 1 + ... + c_0
的方程式,但您也必须选择n
)。或神经网络(您必须修复拓扑)。
如果你这样做,参数拟合很容易(如果你有一个像我提到的那样的理智模型)。特别是对于线性和多项式模型,请查看here和here。
让一些算法找到一个结构。如果您愿意留在神经网络中,可以使用NEAT或HyperNEAT。或者,如果您确实需要符号描述,则可以使用Genetic Programming和类似的算法。或者如果你想要一个多项式,但你不知道它的程度,你可以尝试其中几个。
<强> 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。