Matlab 用绝对值解微分方程
我想解这个方程: x'=-A.x+B.| sin(100*pi*t)| 我使用的ode45如下:Matlab 用绝对值解微分方程,matlab,differential-equations,Matlab,Differential Equations,我想解这个方程: x'=-A.x+B.| sin(100*pi*t)| 我使用的ode45如下: function find_x t = 0:0.001:10; x0 = 0; R1 = 90000; R2 = 1000; C = 0.001; [t,x]=ode45(@rhs, t , x0); plot(t,x); function dxdt = rhs(t,x) dxdt = -(C/R1 + C/R2)*x + C/R1*abs(sin(100*pi*t))
function find_x
t = 0:0.001:10;
x0 = 0;
R1 = 90000;
R2 = 1000;
C = 0.001;
[t,x]=ode45(@rhs, t , x0);
plot(t,x);
function dxdt = rhs(t,x)
dxdt = -(C/R1 + C/R2)*x + C/R1*abs(sin(100*pi*t)) ;
%It's form is dx/dt = -A.x + B.U(t)
end
end
但我认为它给了我错误的答案。
实际上,我从一个问题中得到了这个方程,“在二极管电桥和电容器之后找到输出电压形式”,如下所示:
有人能给我建议另一种解决方法吗?谢谢。这不是解决这个问题的好地方,这让我回到了我的信号与系统时代,但基本上你的方程应该用C作为除法器 记住它是
I = C *dV/dt
因此,如果您在RHS上有dV/dt,您应该期望在LHS上看到1/C:
function khan
t = 0:0.001:10;
x0 = 0;
R1 = 90000;
R2 = 1000;
C = 0.001;
options = odeset('RelTol',1e-6,'AbsTol',1e-8);
[t,x]=ode45(@rhs, t , x0,options);
plot(t,x);
function dxdt = rhs(t,x)
dxdt = -(1/R1 + 1/R2)*x/C + 1/R1*abs(sin(100*pi*t))/C ;
%It's form is dx/dt = -A.x + B.U(t)
end
end
这不是解决这个问题的好地方,这让我回到了我的信号与系统时代,但基本上你的方程应该用C作为除法器 记住它是
I = C *dV/dt
因此,如果您在RHS上有dV/dt,您应该期望在LHS上看到1/C:
function khan
t = 0:0.001:10;
x0 = 0;
R1 = 90000;
R2 = 1000;
C = 0.001;
options = odeset('RelTol',1e-6,'AbsTol',1e-8);
[t,x]=ode45(@rhs, t , x0,options);
plot(t,x);
function dxdt = rhs(t,x)
dxdt = -(1/R1 + 1/R2)*x/C + 1/R1*abs(sin(100*pi*t))/C ;
%It's form is dx/dt = -A.x + B.U(t)
end
end
这个问题可能更适合electronics.stackexchange.com。从MATLAB的角度来看,您似乎正确地使用了
ode45
。我不知道我使用abs(sin(100*pi*t))
是对还是错。其中一种方法是像您所做的那样对不连续性进行处理。对于其他方法,这个问题需要转移到这里,这可能不是获得电子方面帮助的地方。然而,我看到了一个潜在的问题。您正在尝试集成非常小的值。您的参数“缩放不良”。C/R1
大约是1e-8
。使用不同的单元是个好主意。您至少希望这样做以增加集成容差:opts=odeset('RelTol',1e-12',absol',1e-12);[t,x]=ode45(@rhs,t,0,opts)代码>。注意当您这样做时输出是如何变化的(它可能不是您想要的,但它是不同的)。这表明默认公差不够。你的参数小,频率高,非线性强(abs
)。这个问题可能更适合electronics.stackexchange.com。从MATLAB的角度来看,您似乎正确地使用了ode45
。我不知道我使用abs(sin(100*pi*t))
是对还是错。其中一种方法是像您所做的那样对不连续性进行处理。对于其他方法,这个问题需要转移到这里,这可能不是获得电子方面帮助的地方。然而,我看到了一个潜在的问题。您正在尝试集成非常小的值。您的参数“缩放不良”。C/R1
大约是1e-8
。使用不同的单元是个好主意。您至少希望这样做以增加集成容差:opts=odeset('RelTol',1e-12',absol',1e-12);[t,x]=ode45(@rhs,t,0,opts)代码>。注意当您这样做时输出是如何变化的(它可能不是您想要的,但它是不同的)。这表明默认公差不够。你有小参数、高频振荡和强非线性(abs
)。你真的认为这个函数有一个类似于你的图的解决方案吗?我知道你不知道。考虑一下<代码> ODE45 的默认容差和结果的大小。我建议:opts=odeset('RelTol',1e-6,'absol',1e-9);[t,x]=ode45(@rhs,t,x0,opts)代码>@horchler。。。我的缺点是,我认为两者的默认公差都是1e-8,同时也认为频率相对较小。谢谢你,修好了。不过态度可能会更好。@Rasman:这个结果正是我所期望的,非常感谢。原来的方程式我错了:)我有一个新问题。输出电压v是DC,我认为它等于输入的rms(经过多次(R10+R11)/R11=91)。但事实是,v*91和VRM之间的比率为10/9。我试着改变R1、R2和C的值,甚至改变频率,但是10/9的比例没有改变。那么这个比率是多少<代码>绘图(t,(R10+R11)/R11*x*10/9);Y0=220;%Y0是输入V(s)图(t,Y0)的rms你真的认为这个函数有一个类似于你的图的解决方案吗?我知道你不知道。考虑一下<代码> ODE45 的默认容差和结果的大小。我建议:opts=odeset('RelTol',1e-6,'absol',1e-9);[t,x]=ode45(@rhs,t,x0,opts)代码>@horchler。。。我的缺点是,我认为两者的默认公差都是1e-8,同时也认为频率相对较小。谢谢你,修好了。不过态度可能会更好。@Rasman:这个结果正是我所期望的,非常感谢。原来的方程式我错了:)我有一个新问题。输出电压v是DC,我认为它等于输入的rms(经过多次(R10+R11)/R11=91)。但事实是,v*91和VRM之间的比率为10/9。我试着改变R1、R2和C的值,甚至改变频率,但是10/9的比例没有改变。那么这个比率是多少<代码>绘图(t,(R10+R11)/R11*x*10/9);Y0=220;%Y0是输入V(s)图(t,Y0)的rms代码>