Matlab I';我在努力解决这个问题

Matlab I';我在努力解决这个问题,matlab,Matlab,我正试图用ode45解决问题。 在ode45中,使用x'和x''。然后,我想从ode45到x的方程 我试着用多元拟合函数求解 polyfit(t,y,4) 但出现错误“X和Y向量必须大小相同。” 我不知道该怎么办 在我看来,它似乎可以用积分函数来求解。这是正确的吗 如果您能处理好,并告诉我如何解决,我们将不胜感激 代码如下: 我的代码是用主脚本和函数构建的 clear global L M m f Jw rw Fz Cd p A bw fw Nw g uw seta Te Tb y_curve

我正试图用ode45解决问题。

在ode45中,使用x'和x''。然后,我想从ode45到x的方程

我试着用多元拟合函数求解

polyfit(t,y,4)
但出现错误“X和Y向量必须大小相同。”

我不知道该怎么办

在我看来,它似乎可以用积分函数来求解。这是正确的吗

如果您能处理好,并告诉我如何解决,我们将不胜感激

代码如下:

我的代码是用主脚本和函数构建的

clear
global L M m f Jw rw Fz Cd p A bw fw Nw g uw seta Te Tb y_curve X Q
L=[0 0.025 0.05 0.1 0.125 0.15 0.175 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1];
M=[0 0.225 0.45 0.65 0.685 0.705 0.69 0.68 0.65 0.635 0.63 0.6275 0.625 0.6225 0.62 0.6175 0.615 0.6125 0.610 0.6075 0.6050 0.6 0.5975 0.5950];

m = 1400;  f= 0.01;  Jw = 0.65; rw= 0.31; Fz = 3560; Cd = 0.5; p = 1.202; 
A = 1.95; bw = 0; fw = 0; Nw = 4; g = 9.81; uw = 0; seta = 0; Te = 0; Tb = 1000;
X=polyfit(L,M,20);
x_curve = 0:0.025:1;
y_curve = polyval(X,x_curve);
[t,i] = ode45('dot',[0:0.1:1],[20 20]);
Q = polyfit(t,i,4);
%subplot(1, 2, 1);
%plot(L,M,'p',x_curve,y_curve,'m');
xlabel('Lamda')
ylabel('mu'); grid;

%subplot(1, 2, 2);
plot(t,i); grid on;
xlabel('time(s)');
ylabel('x');


这相对简单:输出
i
有两列宽(因为
x
中有两个元素),但
t
中只有一列宽。因此:

Q1 = polyfit(t,i(:,1), 4);
Q2 = polyfit(t,i(:,2), 4);
这就是诀窍

然而,在多项式拟合中,我也遇到了一个条件问题。此问题您可以使用缩放/移位选项解决,如
帮助polyfit
中所述

导数中的某个地方也有一个奇点,因为最后几个条目是
NaN
,由
xdot
的一个值无限制增长引起。因此,对于
Q1
Q2
,您可以得到所有
NaN

下面是实现此更改的代码版本,并显示了一些被广泛认为优于当前样式的编程实践:

  • 与脚本相比,更喜欢函数
  • 记录每个不同原子操作的意图(“命令块”)
  • 选择提供代码基本自我文档的变量名
  • 不要过度使用括号。必要时,或当括号显著提高阅读能力时,使用括号
  • 数学运算符之间的间距。这使得识别术语和理解什么属于什么变得更加容易——这是一个非常棒的bug来源
  • 对齐代码。您只需编写一次代码,但要阅读数百次--使这一部分变得简单
  • 在MATLAB中:如果你发现自己在做一个重复的复制粘贴工作,或者一行代码超过了85列标记,那么可能有一种更短、更可读、更好理解、更好维护的“矢量化”方法
在这里工作(R2010a):


请注意,
%/
%
只是为了让代码格式化对每个人都有效

这相对容易:输出
i
有两列宽(因为
x
中有两个元素),但
t
中只有一列。因此:

Q1 = polyfit(t,i(:,1), 4);
Q2 = polyfit(t,i(:,2), 4);
这就是诀窍

然而,在多项式拟合中,我也遇到了一个条件问题。此问题您可以使用缩放/移位选项解决,如
帮助polyfit
中所述

导数中的某个地方也有一个奇点,因为最后几个条目是
NaN
,由
xdot
的一个值无限制增长引起。因此,对于
Q1
Q2
,您可以得到所有
NaN

下面是实现此更改的代码版本,并显示了一些被广泛认为优于当前样式的编程实践:

  • 与脚本相比,更喜欢函数
  • 记录每个不同原子操作的意图(“命令块”)
  • 选择提供代码基本自我文档的变量名
  • 不要过度使用括号。必要时,或当括号显著提高阅读能力时,使用括号
  • 数学运算符之间的间距。这使得识别术语和理解什么属于什么变得更加容易——这是一个非常棒的bug来源
  • 对齐代码。您只需编写一次代码,但要阅读数百次--使这一部分变得简单
  • 在MATLAB中:如果你发现自己在做一个重复的复制粘贴工作,或者一行代码超过了85列标记,那么可能有一种更短、更可读、更好理解、更好维护的“矢量化”方法
在这里工作(R2010a):


请注意,
%/
%
只是为了让代码格式化对每个人都有效

您是如何使用polyfit的?你有没有把你的问题分成两个一阶ODE?我们需要更多的信息来正确地帮助。我附上了我的代码。谢谢。您是如何使用polyfit的?你有没有把你的问题分成两个一阶ODE?我们需要更多的信息来正确地帮助。我附上了我的代码。谢谢,非常感谢。我意识到我需要努力训练。非常感谢。我意识到我需要努力训练。
function myFun

    %// Your data
    L = [0 0.025 0.05 0.1 0.125 0.15 0.175 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1];
    M = [0 0.225 0.45 0.65 0.685 0.705 0.69 0.68 0.65 0.635 0.63 0.6275 0.625 0.6225 0.62 0.6175 0.615 0.6125 0.610 0.6075 0.6050 0.6 0.5975 0.5950];

    %// Your coefficients
    A    = 1.95;     m  = 1400;  
    bw   = 0;        f  = 0.01;  
    fw   = 0;        Jw = 0.65; 
    Nw   = 4;        rw = 0.31; 
    g    = 9.81;     Fz = 3560; 
    uw   = 0;        Cd = 0.5; 
    seta = 0;        p  = 1.202;
    Te   = 0;        N  = 20;   %// (degree of polynomial)
    Tb   = 1000;

    %// Find best-fitting polynomial
    [X,~,mu] = polyfit(L,M,N);

    %// Or, if you like, a much faster alternative:
    %// X = bsxfun(@power, (L(:)-mean(L))/std(L), N:-1:0)\M(:);

    %// Plot the poly over the data 
    %// DEBUG -- put a space between the percent sign and brace below to include
    %{ 
    subplot(2,1,1), hold on
    x_curve = 0:0.025:1;
    y_curve = polyval(X,x_curve, [], mu);
    plot(L,M,'p',x_curve,y_curve,'m');
    xlabel('Lambda')
    ylabel('mu'); 
    grid on
    %}

    %// Carry out the integration
    tspan = [0 1];
    x0    = [20 20];
    [t,i] = ode45(@dxdt, tspan, x0);

    %// Fit a polynomal through the solutions
    Q1 = polyfit(t,i(:,1), 4);
    Q2 = polyfit(t,i(:,2), 4);

    %// Plot integration results        
    %// DEBUG -- put a space between the percent sign and brace below to include
    %{
    subplot(2,1,2), hold on
    plot(t,i); 
    grid on    
    xlabel('time(s)');
    ylabel('x');
    %}

    %// The time derivative
    function xdot = dxdt(~,x)

        %// Polynomial value for these X
        Y = ((x(2)-x(1))/x(1)).^(N:-1:0) * X.';  %'

        %// The derivative:
        xdot = [
            (-p/2*Cd*A*(x(1)*rw)^2 - f*m*g + Nw*Y*Fz)/rw/m
            (Te - Tb - rw*Y*Fz)/Jw
         ];

    end    

end