简单的对数曲线拟合

Easy logaritmic curve fitting

我正在尝试对一些表现为对数函数的度量 (lux, ohm) 建模。

为了做到这一点,我尝试使用 MATLAB 对其进行建模,方法是使用自然对数投影实数值,然后使用 polyfit 获得线性表达式。然后,我想隔离变量 lux.

我目前拥有的是:

% Original values from spreadsheet
lux = [1, 5, 10, 50, 100]';
ohm = [100, 35, 25, 8, 6]';

% Logaritmic fitting
x_ = log(lux);
y_ = log(ohm);
p = polyfit(x_,y_,1)

x1 = linspace(x_(1), x_(end), 1000);
y1 = polyval(p,x1);
plot(x_,y_,'ob');
hold on;
plot(x1,y1, 'r');
hold on;

% Get expression
% y = -0.6212x + 4.5944
% log(ohm) = -0.6212 * log(lux) + 4.5944

lfun = @(ohm, a, b) ((ohm/exp(b)).^(1/a));
a = p(1);
b = p(2);
t = linspace(1,100,100);

plot(log(t), log(lfun(t, a, b)), '--g');
hold off;
legend({'points','poly','eq'});

因为我得到了p = -0.6212 4.5944,我假设方程是log(ohm) = -0.6212 * log(lux) + 4.5944。隔离变量 lux 结果:

lux = (ohm / exp(4.5944) ).^(-1/0.6212)

但是,从绿线可以看出,是不行的!

我做错了什么?

除了绘图之外,您所做的一切都正确,在第一个图中,您将 x 轴定义为 log(lux),将 y 轴定义为 log(ohm),但要坚持在第二种情况下你需要翻转参数:

plot(log(lfun(t, a, b)), log(t), '--g')

t 指的是 'ohm',因此必须显示在 y 轴上以与第一个图重合。