如何使用 Octave 在给定特定 y 轴值的情况下返回特定 x 轴值?

问题描述 投票:0回答:1

我尝试使用第一维插值函数以及样条函数来查找半对数到分贝图上与 0dB 相对应的值。

% This calculates the open loop gain of the LM741
clear; clc;
format short eng

f = logspace(-1,7,2E6);  % Frequency range
A0 = 200E3;  % DC gain of LM741
f0 = 4;  % Compensation frequency

A = A0./(1 + j*(f/f0));   % Open loop gain calculation
dB = 20*log10(A);         % Gain to dB conversion
semilogx(f,dB)            % Plot db to f in semilog domain

y0 = 0;                     % Y value for line
line([0.1, 1E7], [y0, y0], 'linestyle','--') % Create horizontal line at y value

xlabel('f [Hz]')
ylabel('A [db]')
title('Open loop gain of LM741')
set(gca,'fontsize',14)
grid on

x0 = abs(spline(dB,f,y0))
x0_2 = abs(interp1(dB,f,y0,'linear'))

上面的代码是我发送到八度音阶以生成图形和 f 在 dB = 0 时的尝试值。当我放大图形时,交叉点发生在 ~800kHz。然而,x0 和 x0_2 的值在控制台中的输出如下:

x0 = 56.9593e+006
x0_2 =  NA

为什么插值样条值会有这么大的偏差?为什么线性插值返回“NA”?我假设我在这里误解了一些数学特征。我是一名技术学院的学生,即将转学到大学电气工程专业,所以请原谅我缺乏数学知识。

坦率地说,我的数学之旅还很早,插值函数中的许多概念都很难理解。我见过类似的答案,其中涉及创建我试图复制的多项式评估,但仍然未能得到我正在寻找的答案。

我假设答案是多项式拟合和求值的特征,但我已经阅读了所有相应的文档,但仍然无法理解解决这个答案的步骤。

octave interpolation octave-gui
1个回答
0
投票

您声明的目标是找到

f
对应的
abs(dB(f)) = 0
的值,但您的计算发现
abs(dB(0))
,这不是同一件事。您已经替换了
f = 0
,但您需要做的是解决
f
。您可以使用
fsolve()
函数来做到这一点。以下代码

A0 = 200E3;
f0 = 4;
y0 = 0;

function y = dB(f, A0, f0)  
    A = A0./(1 + j*(f/f0));   
    y = abs(20*log10(A));
endfunction

a = @(f) dB(f, A0, f0) - y0;

y = fsolve(a, 1e6)

打印出

y = 799.8047e+003
。传递给
1e6
函数的参数
fsolve
是一个初始“猜测”,函数从中找到解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.