我已经尝试过matlab的曲线拟合效果很好,但是在表面拟合的情况下,matlab忽略了第二个自变量。下面是一个复制问题的示例。
function curve_fitting_test()
x1 = (1:100)';
x2 = (1:100)';
y = 10.*x1 + 20.*x2 + 30;
ft = fittype(@(a,b,c,x1,x2)a.*x1 + b.*x2 + c, 'independent', {'x1', 'x2'});
cf = fit([x1 x2], y, ft, 'start', [25 25 25], 'Lower', [0 0 0], 'Upper', [50 50 50])
这是matlab正在生成的模型:
General model: cf(x1,x2) = a.*x1+b.*x2+c Coefficients (with 95% confidence bounds): a = 15 (15, 15) b = 15 (15, 15) c = 30 (30, 30)
答案 0 :(得分:2)
问题是你的意见:
x1 = (1:100)';
x2 = (1:100)';
y = 10.*x1 + 20.*x2 + 30;
y
仅针对此处x1
= x2
的情况进行计算,而非所有组合。因此,只要y = 30.*x1 + 30
,y = 30.*x2 + 30
到a + b = 30
之内的任何内容都是可以接受的。您可以通过绘制原始数据(黑点)与拟合来看到这一点 - MATLAB找到的拟合对于给出的数据是完全可以接受的:
解决方案是更改您的数据输入。例如,只需将x1
和x2
更改为1到100之间的随机整数,其他所有代码都相同:
x1 = randi(100,100,1);
x2 = randi(100,100,1);
装修后给我:
General model:
cf(x1,x2) = a.*x1+b.*x2+c
Coefficients (with 95% confidence bounds):
a = 10 (10, 10)
b = 20 (20, 20)
c = 30 (30, 30)