Matlab 中拟合函数的错误系数
Wrong coefficients from fit function in Matlab
我有一个 table 看起来像这样:
x Line Name
-40 -30 -20 -10 0 10 20 30 40 50
-1500 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
-1000 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 700
1000 NaN NaN NaN NaN NaN NaN NaN NaN NaN 673
2000 NaN NaN NaN NaN NaN NaN NaN NaN 689 646
3000 NaN NaN NaN NaN NaN NaN NaN 694 662 NaN
4000 NaN NaN NaN NaN NaN NaN 696 668 636 NaN
5000 NaN NaN NaN NaN NaN 695 669 642 611 NaN
6000 NaN NaN NaN NaN 693 669 644 617 587 NaN
7000 NaN NaN NaN 691 666 643 619 593 563 NaN
8000 NaN NaN 691 665 641 619 595 569 NaN NaN
9000 NaN 691 664 639 616 595 572 547 NaN NaN
10000 691 664 639 615 592 571 550 525 NaN NaN
11000 664 638 614 591 569 549 528 503 NaN NaN
12000 638 613 590 567 546 527 507 483 NaN NaN
13000 612 589 566 545 525 506 486 NaN NaN NaN
14000 587 564 543 522 503 485 466 NaN NaN NaN
15000 562 541 520 500 482 465 446 NaN NaN NaN
16000 539 518 498 479 462 446 428 NaN NaN NaN
17000 516 496 477 459 442 427 409 NaN NaN NaN
18000 494 475 457 439 423 409 NaN NaN NaN NaN
19000 473 455 437 420 405 392 NaN NaN NaN NaN
20000 452 435 418 402 388 375 NaN NaN NaN NaN
我可以绘制如下图:
蓝线从左到右代表 "Line Name" -40 到 50。
这是您可以复制的确切代码:
%% Load data
Array6 =[NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN 700
NaN NaN NaN NaN NaN NaN NaN NaN NaN 673
NaN NaN NaN NaN NaN NaN NaN NaN 689 646
NaN NaN NaN NaN NaN NaN NaN 694 662 NaN
NaN NaN NaN NaN NaN NaN 696 668 636 NaN
NaN NaN NaN NaN NaN 695 669 642 611 NaN
NaN NaN NaN NaN 693 669 644 617 587 NaN
NaN NaN NaN 691 666 643 619 593 563 NaN
NaN NaN 691 665 641 619 595 569 NaN NaN
NaN 691 664 639 616 595 572 547 NaN NaN
691 664 639 615 592 571 550 525 NaN NaN
664 638 614 591 569 549 528 503 NaN NaN
638 613 590 567 546 527 507 483 NaN NaN
612 589 566 545 525 506 486 NaN NaN NaN
587 564 543 522 503 485 466 NaN NaN NaN
562 541 520 500 482 465 446 NaN NaN NaN
539 518 498 479 462 446 428 NaN NaN NaN
516 496 477 459 442 427 409 NaN NaN NaN
494 475 457 439 423 409 NaN NaN NaN NaN
473 455 437 420 405 392 NaN NaN NaN NaN
452 435 418 402 388 375 NaN NaN NaN NaN];
MakeMatrix = [-1500,-1000:1000:20000];
x = transpose([MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix]); %transpose switches rows and columns=to match array dimentions
%% Plot
hold on
A=plot(x,Array6,'b*')
grid on
grid minor
这是个大问题,相信我,我已经尝试解决这个问题一个星期了,但还没有解决。我想将 "Line Name" -50、-40 和 -20 的数据分成向量,如下所示:
x1 = transpose([-1500,-1000:1000:20000]); y1 = Array6(:,1); %LineName-40
x2 = transpose([-1500,-1000:1000:20000]); y2 = Array6(:,2); %LineName-30
x3 = transpose([-1500,-1000:1000:20000]); y3 = Array6(:,4); %LineName-10
问题是我适合的 NaN 无法工作,但这已解决,如下所示:
f = fittype('poly2');
DatumLine1Fit = fit(x1,y1,f, 'Exclude', isnan(y1));
DatumLine2Fit = fit(x2,y2,f, 'Exclude', isnan(y2));
DatumLine3Fit = fit(x3,y3,f, 'Exclude', isnan(y3));
现在我获取系数并将它们放入矩阵中:
DatumLine1Coeff = coeffvalues(DatumLine1Fit);
DatumLine2Coeff = coeffvalues(DatumLine2Fit);
DatumLine3Coeff = coeffvalues(DatumLine3Fit);
CoeffMatrix3x3 = transpose([DatumLine1Coeff;DatumLine2Coeff;DatumLine3Coeff]);
这给出 CoeffMatrix3x3 值为:
3.64801864801874e-07 3.46403596403601e-07 3.13873626373624e-07
-0.0348622377622380 -0.0333289210789212 -0.0307339285714285
1003.38694638695 962.893356643357 890.746978021977
但是,这就是问题所在,这是库仑(10,9 和 7)的系数,它位于矩阵的另一侧,而不是我的代码中指示的库仑(1,2 和 4) ?
库仑(1,2 和 4)的正确 CoeffMatrix3x3 应该是:
4.5e-07 3.393e-07 3.25e-07
-0.02775 -0.02815 -0.02881
700.6 744.1 805.8
这里有一些代码可以直观地验证是否获得了错误的系数(注意拟合线位于第 20,40 和 50 行......它们应该位于 -40、-30、-10 行):
DatumLineSet = [-40 -30 -10]; % Left Original lines used for coefficient determination(Not need to be eavenly spaced)
AdditionalLineSet = [-40: 10:-10]; % Left Additional lines to be plotted from the DatumLineSet
FitLine_XRange = -5000:100:20000; %X-Axis points created for the fit line to follow
for i = 1:length(AdditionalLineSet), %length= For vectors, the length is simply the number of elements
% straight line coefficients
c02 = interp1(DatumLineSet,CoeffMatrix3x3(1,:),AdditionalLineSet(i)); %a from y=ax^2+bx+c
c01 = interp1(DatumLineSet,CoeffMatrix3x3(2,:),AdditionalLineSet(i)); %b
c00 = interp1(DatumLineSet,CoeffMatrix3x3(3,:),AdditionalLineSet(i)); %c
% generate the line
FitLine_YRange = polyval([c02 c01 c00],FitLine_XRange);
plot(FitLine_XRange,FitLine_YRange,'b');
end
请帮忙。非常感谢!您可以使用 matlab 曲线拟合应用程序找到正确的系数,如我的评论中所述。
我相信你的代码没有问题。问题在于你最后要比较的是什么。
如果我手动构建并拟合您数据的第一列:
format shortg
x1=[10000:1000:20000]';
y1=[691;664;638;612;587;562;539;516;494;473;452];
coeffvalues(fit(x1,y1,'poly2'))'
ans =
3.648e-07
-0.034862
1003.4
这与您的代码给出的相同,表明您所比较的末尾的 'correct' 答案是错误的。
作为一个 efficiency/readability 问题,您还应该更改行:
x = transpose([MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix]); %transpose switches rows and columns=to match array dimentions
到
x = transpose(repmat(MakeMatrix,10,1));
甚至
x = repmat(MakeMatrix,10,1)';
%% 编辑
在查看您下面的新评论后,我相信我已经发现了问题所在:
在上面的情节之后,你发表声明:
From Left to right the blue lines represent "Line Name" -40 to 50.
这是造成混乱的不正确陈述。这可以通过将 table 的第一列和最后一列与绘图的左右曲线进行比较来验证:
在table中,“-40”列有11个整数值,“50”列有3个整数值。
在图中,最右边的点集有 11 个值,最左边的点集有 3 个值。
我有一个 table 看起来像这样:
x Line Name
-40 -30 -20 -10 0 10 20 30 40 50
-1500 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
-1000 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 700
1000 NaN NaN NaN NaN NaN NaN NaN NaN NaN 673
2000 NaN NaN NaN NaN NaN NaN NaN NaN 689 646
3000 NaN NaN NaN NaN NaN NaN NaN 694 662 NaN
4000 NaN NaN NaN NaN NaN NaN 696 668 636 NaN
5000 NaN NaN NaN NaN NaN 695 669 642 611 NaN
6000 NaN NaN NaN NaN 693 669 644 617 587 NaN
7000 NaN NaN NaN 691 666 643 619 593 563 NaN
8000 NaN NaN 691 665 641 619 595 569 NaN NaN
9000 NaN 691 664 639 616 595 572 547 NaN NaN
10000 691 664 639 615 592 571 550 525 NaN NaN
11000 664 638 614 591 569 549 528 503 NaN NaN
12000 638 613 590 567 546 527 507 483 NaN NaN
13000 612 589 566 545 525 506 486 NaN NaN NaN
14000 587 564 543 522 503 485 466 NaN NaN NaN
15000 562 541 520 500 482 465 446 NaN NaN NaN
16000 539 518 498 479 462 446 428 NaN NaN NaN
17000 516 496 477 459 442 427 409 NaN NaN NaN
18000 494 475 457 439 423 409 NaN NaN NaN NaN
19000 473 455 437 420 405 392 NaN NaN NaN NaN
20000 452 435 418 402 388 375 NaN NaN NaN NaN
我可以绘制如下图:
蓝线从左到右代表 "Line Name" -40 到 50。
这是您可以复制的确切代码:
%% Load data
Array6 =[NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN 700
NaN NaN NaN NaN NaN NaN NaN NaN NaN 673
NaN NaN NaN NaN NaN NaN NaN NaN 689 646
NaN NaN NaN NaN NaN NaN NaN 694 662 NaN
NaN NaN NaN NaN NaN NaN 696 668 636 NaN
NaN NaN NaN NaN NaN 695 669 642 611 NaN
NaN NaN NaN NaN 693 669 644 617 587 NaN
NaN NaN NaN 691 666 643 619 593 563 NaN
NaN NaN 691 665 641 619 595 569 NaN NaN
NaN 691 664 639 616 595 572 547 NaN NaN
691 664 639 615 592 571 550 525 NaN NaN
664 638 614 591 569 549 528 503 NaN NaN
638 613 590 567 546 527 507 483 NaN NaN
612 589 566 545 525 506 486 NaN NaN NaN
587 564 543 522 503 485 466 NaN NaN NaN
562 541 520 500 482 465 446 NaN NaN NaN
539 518 498 479 462 446 428 NaN NaN NaN
516 496 477 459 442 427 409 NaN NaN NaN
494 475 457 439 423 409 NaN NaN NaN NaN
473 455 437 420 405 392 NaN NaN NaN NaN
452 435 418 402 388 375 NaN NaN NaN NaN];
MakeMatrix = [-1500,-1000:1000:20000];
x = transpose([MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix]); %transpose switches rows and columns=to match array dimentions
%% Plot
hold on
A=plot(x,Array6,'b*')
grid on
grid minor
这是个大问题,相信我,我已经尝试解决这个问题一个星期了,但还没有解决。我想将 "Line Name" -50、-40 和 -20 的数据分成向量,如下所示:
x1 = transpose([-1500,-1000:1000:20000]); y1 = Array6(:,1); %LineName-40
x2 = transpose([-1500,-1000:1000:20000]); y2 = Array6(:,2); %LineName-30
x3 = transpose([-1500,-1000:1000:20000]); y3 = Array6(:,4); %LineName-10
问题是我适合的 NaN 无法工作,但这已解决,如下所示:
f = fittype('poly2');
DatumLine1Fit = fit(x1,y1,f, 'Exclude', isnan(y1));
DatumLine2Fit = fit(x2,y2,f, 'Exclude', isnan(y2));
DatumLine3Fit = fit(x3,y3,f, 'Exclude', isnan(y3));
现在我获取系数并将它们放入矩阵中:
DatumLine1Coeff = coeffvalues(DatumLine1Fit);
DatumLine2Coeff = coeffvalues(DatumLine2Fit);
DatumLine3Coeff = coeffvalues(DatumLine3Fit);
CoeffMatrix3x3 = transpose([DatumLine1Coeff;DatumLine2Coeff;DatumLine3Coeff]);
这给出 CoeffMatrix3x3 值为:
3.64801864801874e-07 3.46403596403601e-07 3.13873626373624e-07
-0.0348622377622380 -0.0333289210789212 -0.0307339285714285
1003.38694638695 962.893356643357 890.746978021977
但是,这就是问题所在,这是库仑(10,9 和 7)的系数,它位于矩阵的另一侧,而不是我的代码中指示的库仑(1,2 和 4) ?
库仑(1,2 和 4)的正确 CoeffMatrix3x3 应该是:
4.5e-07 3.393e-07 3.25e-07
-0.02775 -0.02815 -0.02881
700.6 744.1 805.8
这里有一些代码可以直观地验证是否获得了错误的系数(注意拟合线位于第 20,40 和 50 行......它们应该位于 -40、-30、-10 行):
DatumLineSet = [-40 -30 -10]; % Left Original lines used for coefficient determination(Not need to be eavenly spaced)
AdditionalLineSet = [-40: 10:-10]; % Left Additional lines to be plotted from the DatumLineSet
FitLine_XRange = -5000:100:20000; %X-Axis points created for the fit line to follow
for i = 1:length(AdditionalLineSet), %length= For vectors, the length is simply the number of elements
% straight line coefficients
c02 = interp1(DatumLineSet,CoeffMatrix3x3(1,:),AdditionalLineSet(i)); %a from y=ax^2+bx+c
c01 = interp1(DatumLineSet,CoeffMatrix3x3(2,:),AdditionalLineSet(i)); %b
c00 = interp1(DatumLineSet,CoeffMatrix3x3(3,:),AdditionalLineSet(i)); %c
% generate the line
FitLine_YRange = polyval([c02 c01 c00],FitLine_XRange);
plot(FitLine_XRange,FitLine_YRange,'b');
end
请帮忙。非常感谢!您可以使用 matlab 曲线拟合应用程序找到正确的系数,如我的评论中所述。
我相信你的代码没有问题。问题在于你最后要比较的是什么。
如果我手动构建并拟合您数据的第一列:
format shortg
x1=[10000:1000:20000]';
y1=[691;664;638;612;587;562;539;516;494;473;452];
coeffvalues(fit(x1,y1,'poly2'))'
ans =
3.648e-07
-0.034862
1003.4
这与您的代码给出的相同,表明您所比较的末尾的 'correct' 答案是错误的。
作为一个 efficiency/readability 问题,您还应该更改行:
x = transpose([MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix;MakeMatrix]); %transpose switches rows and columns=to match array dimentions
到
x = transpose(repmat(MakeMatrix,10,1));
甚至
x = repmat(MakeMatrix,10,1)';
%% 编辑
在查看您下面的新评论后,我相信我已经发现了问题所在:
在上面的情节之后,你发表声明:
From Left to right the blue lines represent "Line Name" -40 to 50.
这是造成混乱的不正确陈述。这可以通过将 table 的第一列和最后一列与绘图的左右曲线进行比较来验证:
在table中,“-40”列有11个整数值,“50”列有3个整数值。
在图中,最右边的点集有 11 个值,最左边的点集有 3 个值。