Matlab I';我在努力解决这个问题
我正试图用ode45解决问题。 在ode45中,使用x'和x''。然后,我想从ode45到x的方程 我试着用多元拟合函数求解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
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列标记,那么可能有一种更短、更可读、更好理解、更好维护的“矢量化”方法李>
请注意,
%/
和%
只是为了让代码格式化对每个人都有效 这相对容易:输出i
有两列宽(因为x
中有两个元素),但t
中只有一列。因此:
Q1 = polyfit(t,i(:,1), 4);
Q2 = polyfit(t,i(:,2), 4);
这就是诀窍
然而,在多项式拟合中,我也遇到了一个条件问题。此问题您可以使用缩放/移位选项解决,如帮助polyfit
中所述
导数中的某个地方也有一个奇点,因为最后几个条目是NaN
,由xdot
的一个值无限制增长引起。因此,对于Q1
和Q2
,您可以得到所有NaN
下面是实现此更改的代码版本,并显示了一些被广泛认为优于当前样式的编程实践:
- 与脚本相比,更喜欢函数
- 记录每个不同原子操作的意图(“命令块”)
- 选择提供代码基本自我文档的变量名
- 不要过度使用括号。必要时,或当括号显著提高阅读能力时,使用括号
- 数学运算符之间的间距。这使得识别术语和理解什么属于什么变得更加容易——这是一个非常棒的bug来源
- 对齐代码。您只需编写一次代码,但要阅读数百次--使这一部分变得简单
- 在MATLAB中:如果你发现自己在做一个重复的复制粘贴工作,或者一行代码超过了85列标记,那么可能有一种更短、更可读、更好理解、更好维护的“矢量化”方法李>
请注意,
%/
和%
只是为了让代码格式化对每个人都有效 您是如何使用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