返回首页

数据插值与曲线拟合问题

225 2023-06-01 19:56 admin

一、数据插值与曲线拟合问题

在 Matlab窗口中输入

cftool

然后就是拟合界面,各种爽啊

你是中南土建的吧?

想知道全部答案还是按步骤给分啊

O(∩_∩)O哈哈~

二、如何用matlab做最小二乘法求弹簧的k值

(1)F-x

我们知道F=kx

也就是说,只要把F和樱世x进行线乎颂渗性拟岁脊合就可以了。

比方说你的数据是

x=[1,2,3,4,5,6,7];

F=[9,19,29,41,50,58,71];

k=x'\F'

得到:

k =

9.9500

(2)M-T^2

我们知道

k/M=[(2*pi)/T]^2

变形得

k/(4*pi^2*m)=1/T^2

上式是关于k的一元方程

比说说数据:

T=[1,2,3,4,5,6,7]; %这是T

M=[9,19,29,41,50,58,71];

T2=T.^2;

A=1/4/pi^2./M;

b=1./T2;

k=A'\b'

就可以得到k

我没有时间帮你写程序,建议樱和辩:脊缺

拿到方程以后,把方程转化为标准形式(知道标准形式?)

初棚蠢始化里面的参数。

然后用fminsearch等函数试一下。

三、MATLAB 程序求助

??? Error: File: untitled.m Line: 8 Column: 1

Function definitions are not permitted at the prompt or in scripts.

这个是提示说你写的函数文件要单独建立在一个函数文件中,而不能直接将函数放在脚本文件中。具体方法如下:

一、先建立主程序 main.m

%define the sequence of the program

[A,B,U,Y,M]=define_matrix();

[H,D,I,R1,C2,C1,R2,P,Cd,RO,Q0,X1,P0,G]=input_parameter();

[X2,C,A1]=calculation_parameter(Q0,Cd,P,R2,D,RO,G);

[M]=calculation_matrix(M,A,B,U,Y,I,R1,C2,C1,R2,P0,P,X2,X2,A1,Q0,H,C);

graph_plot(M);

二、建立函数文件1 define_matrix.m

function [A,B,U,Y,M]=define_matrix()

%A_state_matrix

A=zeros(3,3);

%B=input_matrix

B=zeros(3,2);

%U_input_vector

U=zeros(2,1);

%Y_state_matrix

Y=zeros(3,1);

%M_output_matrix

M=zeros(1000,4);

三、建立函数文件2 input_parameter.m

function [H,D,I,R1,C2,C1,R2,P,Cd,RO,Q0,X1,P0,G]=input_parameter()

%步长H(s),阀芯直径D(cm),惯性质量I(kg),阀孔阻尼R1(bar_s/cm3)

%弹簧柔度C2(cm/kg),管道液容C1(cm3/bar),泄油液阻R2(bar_s/cm3)

%设定压力P(bar),初族判始压力P0(bar),流量系数Cd,油液密度RO(袜穗岁kg/告睁cm3)

%泵理论流量Q0(cm3/s),阀口遮盖量X1(cm),重力加速度G(cm/s2)

H=6e-5; D=1.2; I=6.3e-5; R1=0.4; R2=1.5; C2=0.02;

C1=0.08; P=30; Cd=0.7; RO=0.0009; Q0=460; X1=0.14; P0=6; G=981;

四、建立函数文件3 calculation_parameter.m

function [X2,C,A1]=calculation_parameter(Q0,Cd,P,R2,D,RO,G)

PI=3.1415926;

X2=(Q0-P/R2)/(Cd*PI*D*sqrt(2*G*P/RO));

C=-Cd*PI*D*sqrt(2*G/RO);

A1=PI*D*D/4;

五、建立函数文件4 calculation_matrix.m

function [M]=calculation_matrix(M,A,B,U,Y,I,R1,C2,C1,R2,P0,P,X1,

X2,A1,Q0;H,C)

T=0;

A(1,1)=-A1*A1*R1/I; A(1,2)=-1/C2; A(1,3)=A1/C1;

A(2,1)=1/I; A(3,1)=-A1/I; A(3,3)=-1/(R2*C1);

B(1,1)=-1; B(3,2)=1;

U(1)=P*A1-(X1+X2)/C2; U(2)=Q0;

Y(1)=0; Y(2)=0; Y(3)=P0*C1;

M(1,1)=0; M(1,2)=Y(1)/I; M(1,3)=Y(2); M(1,4)=P0;

for j=1:1000,

[Y,T]=R_T(A,B,U,Y,H,X1,C,C1,T);

M(j+1,1)=T; M(j+1,2)=Y(1)/I; M(j+1,3)=Y(2); M(j+1,4)=Y(3)/C1;

end

六、建立函数文件5 R_T.m

function [Y,T]=R_T(A,B,U,Y,H,X1,C,C1,T)

%constrain

if Y(2)<0

Y(2)=0;

end

if Y(2)==0&&Y(1)<0

Y(1)=0;

end

%nonlinear_situation

if Y(2)>X1

A(3,3)=A(3,3)+C*(Y(2)-X1)*sqrt(Y(3)/C1);

end

W=1/3*[0.5,1,1,0.5];

Q=[0.5,0.5,1,0];

TW=T; BB=Y; YW=Y;

for i=1:4

Dy=A*Y+B*U;

T=TW+W(i)*H;

Y=YW+H*Q(i).*Dy;

BB=BB+H*W(i).Dy;

end

Y=BB;

if Y(2)<0

Y(2)=0;

else

if Y(2)==0&&Y(1)<0

Y(1)=0;

end

end

七、建立函数文件6 graph_plot.m

function graph_plot(M)

%%plot_graph

figure(1);

plot(M(:,1),M(:,2));

figure(2);

plot(M(:,1),M(:,3));

figure(3);

plot(M(:,1),M(:,4));

klop>FPHI

at

26

CK=CK*(1.0-Z^2);

改成:

CK=CK.*(1.0-Z.^2);

.运算是matlab特有的,可以查一下用法,也是初学者经常犯的错误

z^2是直接平方是矩阵平方码神高,而只瞎没有方矩阵才能迟尺平方,而z.^2是对数组或矩阵每个元素分别平方,跟矩阵平方不一样

同样a*b是矩阵乘,a.*b是数组或矩阵的对应元素相乘

yn(i,a)<0.5

就是yn矩阵第i行第a列元素小于0.5