我正在努力寻找一种写代码的方法,它可以让我做以下事情:
我有一个叫做fy
的非线性ODE。
fy = g1*p1+g2*p2+g3*p3; % g1,g2,g3 are real-valued numbers and p1,p2,p3 are vectors
g1
、g2
和g3
是用线性回归方法求出的常数。
g1 = 591.5121
g2 = 35.1352
g3 = 107.5798
向量p1
、p2
和p3
如下所示:(很抱歉,我没有给出空穴向量p1
、p2
和p3
,因为它们有1500行:
[ p1 p2 p3] =
-0.8714 -0.0527 -0.3103
-0.3154 -0.0101 0.0874
-0.1972 -0.0029 0.1247
-0.1449 -0.0001 0.1294
-0.1151 0.0012 0.1271
-0.0959 0.0020 0.1231
-0.0824 0.0025 0.1187
-0.0723 0.0028 0.1144
-0.0646 0.0030 0.1104
-0.0584 0.0032 0.1068
-0.0533 0.0033 0.1034
-0.0491 0.0034 0.1003
-0.0455 0.0035 0.0975
-0.0425 0.0035 0.0949
-0.0398 0.0036 0.0925
-0.0375 0.0036 0.0903
-0.0355 0.0036 0.0882
-0.0336 0.0036 0.0863
-0.0320 0.0037 0.0845
-0.0305 0.0037 0.0828
-0.0292 0.0037 0.0812
-0.0280 0.0037 0.0797
-0.0268 0.0037 0.0783
-0.0258 0.0037 0.0769
-0.0249 0.0037 0.0757
-0.0240 0.0037 0.0745
-0.0232 0.0037 0.0733
-0.0224 0.0037 0.0722
-0.0217 0.0037 0.0712
-0.0211 0.0037 0.0702
. . .
. . .
. . .
我正在按如下方式解决ODE
:
fy = g1*p1+g2*p2+g3*p3; (1)
y= xj; % here has xj the same dim. than fy
f = @(yq)interp1(y, fy, yq);
tspan = 0:0.02:1;
x0 = 0.2;
[~, xt] = ode45(@(t,y)f(y), tspan, x0);
我得到了一个非常好的曲线。
我的问题是:我有一个Library
:
Library = [L1 L2 L3]; % L1, L2, L3 are vectors of same size than p1, p2, p3
这个Library
包含潜在的三元组,这些三元组中的一组(在行中给出……比方说568)可以让我得到与从(1)得到的曲线相同的好曲线。换言之,如果我用l1
、l2
和l3
(在Library
的第586行中找到)改变g1
、g2
和g3
,则我应该具有与(1)中几乎相同的结果。
我需要找到一种方法来找到这组三元组!
我唯一可以处理的信息是(1)中的信息和我得到的曲线。如果我必须将所有的曲线与我从(1)中得到的曲线进行比较,那将是可怕的。。。因为我的Library
有1500个三元组,这意味着1500条曲线。。。在我有了三元组之后,我可以用与(1)相同的方法来求解下面的系统。
fy = l1*p1+l2*p2+l3*p3; (2)
y= xj; % xj % has the same dim than fy
f = @(yq)interp1(y, fy, yq);
tspan = 0:0.02:1;
x0 = 0.2;
[~, xt2] = ode45(@(t,y)f(y), tspan, x0);
来自(1)的CCD_ 22应该近似于来自(2)的CCD_。
更多信息:从线性回归中,我本应该得到一组在库中存在的三元组,但事实并非如此。。。正因为如此,我的系统很草率。出于这个原因,我必须找到一种方法,以某种方式连接这两个输出。(g和l)。
您可以使用dsearchn
来查找最接近的三元组。
x = rand(1000,3);
xi = rand(1,3);
k = dsearchn(x,xi);
或者,可以将生成的所有1500条曲线与原始曲线进行比较。有几种技术,比如这里描述的技术——如何找到两条曲线之间的相似性和相似性得分?