需要帮助在Matlab中绘制此函数

时间:2013-09-11 11:56:15

标签: matlab function plot integral singular

我最近开始使用Matlab,我正在尝试绘制Imaginary函数的一部分。我可以看到我在某个地方犯了一个错误,因为我有图表显示我需要得到的东西,而我正在得到别的东西。以下是我需要获得的图表链接,我正在获取的图片以及我正在绘制的函数:

Wanted results, plotted function and obtained graph.

我知道这个函数在270 Hz左右的频率上有一个奇点,我不知道'quadgk'是否能解决积分。你们可能知道但是积分里面的θ功能是一个重量级,我不知道这是否会导致问题?我在这里做错了吗?这是我写的matlab代码:

clear all
clc

ff=1:10:1000;

K1=(2*3)*log(2*cosh(135/6))/pi;
theta1=ones(size(ff));
theta1(ff<270)=0;

I1=zeros(size(ff));

for n = 1:numel(ff)
    f = ff(n);
    I1(n)= K1/f + (f/pi)*quadgk(@(x)(sinh(x/3)/(cosh(135/3)+cosh(x/3))-theta1(n))./((f^2)-4*(x.^2)), 0, inf);
end

plot(ff,I1, 'b');
hold on
axis([0 1000 -0.3 1])

2 个答案:

答案 0 :(得分:2)

  • 首先,我将你的重力函数的表达式改为我认为正确的形式。
  • 其次,我明确地介绍了mu和T的定义。
  • 第三,我将积分分解为4个组成部分,如下所示,并单独评估它们(沿着Fraukje提出的方式)
  • 第四,我使用quadl,虽然这是可能的。不太重要。
  • 编辑)更改了ff
  • 的范围

以下是带有更改的代码:

fstep=1;
ff=[1:fstep:265 275:fstep:1000];

T = 3;
mu = 135;

df = 0.01;
xmax = 10;

K1=(2*T/pi)*log(2*cosh(mu/(2*T)));
theta1=ones(size(ff));
theta1(ff-2*mu<0)=0;

I1=zeros(size(ff));    
for n = 1:numel(ff)
    f = ff(n);
    sigm1 = @(x)  sinh(x/T)./((f^2-4*x.^2).*(cosh(mu/T)+cosh(x/T)));
    sigm2 = @(x)   -theta1(n)./(f^2-4*x.^2);
    I1(n) = K1/f  + (f/pi)*quadl(sigm1,0,f/2-df);      % term #1
%    I1(n) = I1(n) + (f/pi)*quadl(sigm1,f/2+df,xmax);   % term #2
%    I1(n) = I1(n) + (f/pi)*quadl(sigm2,0,f/2-df);     % term #3
%    I1(n) = I1(n) + (f/pi)*quadl(sigm2,f/2+df,xmax);   % term #4
end

我选择将积分分开x=f/2,因为那里有明显的奇点(除以0)。但是对于术语#2和#4会出现其他问题,即当x>f/2评估积分时,可能是由于所有三角项。

如果你只保留第1和第3条,你会得到合理类似于你所显示的情节:

enter image description here

但是,你应该更仔细地检查你的功能,看看可以做些什么来评估x>f/2的积分。

修改

我再次检查了代码并重新定义了辅助积分:

I1=zeros(size(ff));
I2=zeros(size(ff));
I3=zeros(size(ff));

for n = 1:numel(ff)
    f = ff(n);
    sigm3 = @(x)  sinh(x/T)./((f^2-4*x.^2).*(cosh(mu/T)+cosh(x/T))) -theta1(n)./(f^2-4*x.^2);
    I1(n) = K1/f  + (f/pi)*quadl(sigm3,0,f/2-df); 
    I2(n) = (f/pi)*quadl(sigm3,f/2+df,10);
end
I3=I2;
I3(isnan(I3)) = 0;
I3 = I3 + I1;

这就是输出现在的样子:

enter image description here

绿线是0<x<f/2上函数的积分,似乎没问题。红线是Inf>x>f/2上的积分,显然在f=270附近失败。蓝色曲线是在NaN上积分时排除Inf>x>f/2贡献的总和(总积分)。

我的结论是曲线可能会出现问题,因为您希望它看起来像。

答案 1 :(得分:1)

到目前为止,我会这样做:

clc,clear

T = 3;
mu = 135;

f = 1E-04:.1:1000;

theta = ones(size(f));
theta(f < 270)= 0;

integrative = zeros(size(f));
for ii = 1:numel(f)
    ff = @(x) int_y(x, f(ii), theta(ii));
    integrative(ii) = quad(ff,0,2000);
end

Imm = ((2*T)./(pi*f)).*log(2*cosh(mu/(2*T))) + (f/pi).*integrative;

Imm1 = exp(interp1(log(f(1:2399)),log(Imm(1:2399)),log(f(2400):.001:f(2700)),'linear','extrap'));
Imm2 = exp(interp1(log(f(2985:end)),log(Imm(2985:end)),log(f(2701):.001:f(2984)),'linear','extrap'));


plot([(f(2400):.001:f(2700)) (f(2701):.001:f(2984))],[Imm1 Imm2])
hold on
axis([0 1000 -1.0 1])
plot(f,Imm,'g')
grid on
hold off

function rrr = int_y(x,f,theta)
T = 3;
mu = 135;
rrr = ( (sinh(x./T)./(cosh(mu/T) + cosh(x/T))) - theta ) ./ (f.^2 - 4.*(x.^2));
end

我想出了这个情节:

enter image description here