大家好,
我有一个奇怪的问题,我无法弄清楚。 我有 2 个变量(例如 Y 和 X),我想提取连接这两个变量的平滑函数的导数。 如果我的两个变量在表中,我可以“手动”执行此操作。 我只需拟合平滑样条线,保存预测公式,进入公式编辑器并使用编辑器本身中的导数选项。 现在我想做同样的事情,但是以自动化的方式,因为我将有数十个这样的配件要做,所以已经恢复使用 JSL。 据我所知,在 JSL 中实现这一目标的唯一方法是首先提取样条系数:
splcoef=样条系数(X,Y, 1 );
在我使用这个矩阵的特定示例中:
[0.5 0.997009092716414 0.00052834644305232 0 0.0000661345992050551,
1 0.997281532762841 0.000577947392456002 0.0000992018988076818 0.0000439565382573196,
1.5 0.997600801501053 0.000710116694956763 0.000165136706193727
-0.0000523992394403174,
2 0.99799059412015 0.000835953971570102 0.0000865378470331725 -0.0000897493429406088,
2.5 0.998418986899826 0.00085517981139797 -0.0000480861673778753
-0.0000494911432825247,
3 0.99882836887077 0.000769975286558009 -0.000122322882301737 -0.0000204292892022263,
3.5 0.999180222132323 0.000632330437354731 -0.000152966816105107
-0.0000100612562586075,
4 0.999456887989942 0.000471817679055371 -0.000168058700493033 0.0000251846412034386,
4.5 0.999653930234497 0.000322647459465303 -0.000130281738687837
0.0000199230550287456,
5 0.999785173911436 0.000207308012048703 -0.000100397156144689 0.0000256287090160626,
5.5 0.999866932217051 0.000126132387666307 -0.0000619540926205567
0.0000114058197541642,
6 0.999915935615199 0.00007273265986134 -0.0000448453629892932 0.0000100640302564247,
7 0.999953886942327 0.0000132340246520343 -0.0000146532722199889
0.0000064471411305935,
7.5 0.999957646529239 0.0000034161082800262 -0.000004982560524089
0.0000026947675920361,
8 0.999958445789198 0.0000004546234498223 -0.0000009404091360308
0.0000012459427765851,
8.5 0.999958593741486 0.000000448671396435 0.0000009285050288488
-0.0000002521994682104,
9 0.999959018678507 0.0000011880268241599 0.0000005502058265328
-0.0000001515710315195,
9.5 0.999959731296997 0.0000016245543768191 0.0000003228492792533
-0.0000002152328528353,
10 0.999960597382399 0 0 0]
我可以从样条曲线中找到预测值:
predvalues=样条评估( X,splcoef);
为了获得导数,我尝试使用:
dervalues=eval(导数(样条曲线 eval(X, splcoef),X));
但这给出了唯一值零 (0)。
但是,如果我将矩阵引用 splcoef 替换为样条 eval 语句中的实际内容,那么它就可以正常工作了!
dervalues=eval(导数(样条曲线 eval(X,
[0.5 0.997009092716414 0.00052834644305232 0 0.0000661345992050551,
1 0.997281532762841 0.000577947392456002 0.0000992018988076818 0.0000439565382573196,
1.5 0.997600801501053 0.000710116694956763 0.000165136706193727
-0.0000523992394403174,
2 0.99799059412015 0.000835953971570102 0.0000865378470331725 -0.0000897493429406088,
2.5 0.998418986899826 0.00085517981139797 -0.0000480861673778753
-0.0000494911432825247,
3 0.99882836887077 0.000769975286558009 -0.000122322882301737 -0.0000204292892022263,
3.5 0.999180222132323 0.000632330437354731 -0.000152966816105107
-0.0000100612562586075,
4 0.999456887989942 0.000471817679055371 -0.000168058700493033 0.0000251846412034386,
4.5 0.999653930234497 0.000322647459465303 -0.000130281738687837
0.0000199230550287456,
5 0.999785173911436 0.000207308012048703 -0.000100397156144689 0.0000256287090160626,
5.5 0.999866932217051 0.000126132387666307 -0.0000619540926205567
0.0000114058197541642,
6 0.999915935615199 0.00007273265986134 -0.0000448453629892932 0.0000100640302564247,
7 0.999953886942327 0.0000132340246520343 -0.0000146532722199889
0.0000064471411305935,
7.5 0.999957646529239 0.0000034161082800262 -0.000004982560524089
0.0000026947675920361,
8 0.999958445789198 0.0000004546234498223 -0.0000009404091360308
0.0000012459427765851,
8.5 0.999958593741486 0.000000448671396435 0.0000009285050288488
-0.0000002521994682104,
9 0.999959018678507 0.0000011880268241599 0.0000005502058265328
-0.0000001515710315195,
9.5 0.999959731296997 0.0000016245543768191 0.0000003228492792533
-0.0000002152328528353,
10 0.999960597382399 0 0 0]
),X));
我所做的就是用其内容替换矩阵名称。 这看起来不像正常行为。
我有什么想法让它发挥作用吗?
非常感谢,伊夫·P.
尝试一下评估( Evalexpr( ) ) cunstruct 强制预评估矩阵。
Names Default To Here(1);
X = 1 :: 100;
Y = Normal Distribution(X, 50, 25);
splcoef = Spline Coef(X, Y, 1);
predvalues = Spline Eval(X, Spline Coef(X, Y, 1));
dervalues = Eval(Eval Expr(Derivative(Spline Eval(X, Expr(splcoef)), X)));
// Plot to see if it works
dt = New Table("test", add rows(100));
dt << New Column("X", values(X)) << New Column("Y", values(predvalues)) <<
New Column("dY", values(dervalues));
dt << Graph Builder(
Variables(X(:X), Y(:Y), Y(:dY)),
Elements(Position(1, 1), Points(X, Y)),
Elements(Position(1, 2), Points(X, Y))
);