24小时热门版块排行榜    

查看: 497  |  回复: 2

astonesh

新虫 (初入文坛)

[交流] 求助,matlab 四阶龙格库塔结合二乘法的问题 已有1人参与

function k
format long
clear all
clc
x0 = 0;
k0 = 0;   
lb = 0.1;
ub = 0.5;
tspan=linspace(0,400,800);
[m,n]=ode45(@example,tspan,0);
tspan = m;
data=n;
plot(tspan,data);
yexp = data';
options = optimset('Display','iter','TolFun',1e-10,'TolX',1e-10)
[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@ObjFunc,k0,lb,ub,options,tspan,x0,yexp);      
ci = nlparci(k,residual,jacobian);
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\tk = %.9f ± %.9f\n',k,ci(1,2)-k)
function f = ObjFunc(k,tspan,x0,yexp)           % 目标函数
[tspan,Xsim] = ode45(@example2,tspan,0,[],k);
Ysim=Xsim';
Ysim=Ysim(2:end);
f = Ysim(:,1)-yexp(:,1);

function dy = example(t,y)
pi=3.14;
dy=0.1*y-0.1*y.^3+0.3*sin(2*pi*0.01*t)+sqrt(2)*randn(size(t));


function dy = example2(t,y,k)  %ode 模型
%UNTITLED4 Summary of this function goes here
%   Detailed explanation goes here
pi=3.14;
dy=0.1*y-0.1*y.^3+k*sin(2*pi*0.01*t)+sqrt(2)*randn(size(t));
这是一个正确的程序。但是我想问,如果把sqrt(2)*randn(size(t))改为一个已知的1*800数组,然后对应时间t依次代进去,怎么弄?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)


小木虫: 金币+0.5, 给个红包,谢谢回帖
大概看了一下, 用for 语句试试。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
2楼2014-10-28 08:37:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

astonesh

新虫 (初入文坛)

引用回帖:
2楼: Originally posted by 月只蓝 at 2014-10-28 08:37:59
大概看了一下, 用for 语句试试。

function k
format long
clear all
clc
x0 = 0;
k0 = 0;   
lb = 0.1;
ub = 0.5;
tspan=linspace(0,400,800);
[m,n]=ode45(@example,tspan,0);
tspan = m;
data=n;
plot(tspan,data);
  
yexp = data';
options = optimset('Display','iter','TolFun',1e-10,'TolX',1e-10)

[k,resnorm,residual,exitflag,output,lambda,jacobian] = ...
    lsqnonlin(@ObjFunc,k0,lb,ub,options,tspan,x0,yexp);      
ci = nlparci(k,residual,jacobian);
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\tk = %.9f ± %.9f\n',k,ci(1,2)-k)


function f = ObjFunc(k,tspan,x0,yexp)           % 目标函数
[tspan,Xsim] = example2(tspan,k,x0);
Ysim=Xsim';
Ysim=Ysim(2:end);

f = Ysim(:,1)-yexp(:,1);


function dy = example(t,y,y0)

pi=3.14;
dy=0.1*y-0.1*y.^3+0.3*sin(2*pi*0.01*t)+sqrt(2)*randn(size(t));


function [t,y] = example2(t,k,y0)  %ode 模型

fs=4;%采样频率
%T=1/fs;%采样时间
N=4096;%数据点数
%t=(0:N-1)*T;%时间序列
pi=3.14;
t_1=linspace(0,400,800);
[m1,n1]=ode45(@example,t_1,0);
subplot(3,2,1)
plot(m1,n1);

NFFT=2^nextpow2(N);%求得最接近总采样点的2^n,
Y2=fft(n1,NFFT)/N;
y2=2*abs(Y2(1:NFFT/20+1));
f2=fs/2*linspace(0,0.1,NFFT/20+1);%频率序列
subplot(3,2,2)
plot(f2,y2);
%第二个经过SR的频谱图

LPF = ones(4096,1);  
LPF(18:24)=zeros(7,1); %截止频率100Hz
%LPF(14:18)=zeros(5,1); %截止频率100Hz

Ylv4 = Y2.*LPF;
f4=fs/2*linspace(0,0.1,NFFT/20+1);
ylv4=2*abs(Ylv4(1:NFFT/20+1));
subplot(3,2,4)
plot(f4,ylv4);
%第四个图是幅值置0后对比图

T5=1/N;
%t5=(0:N-1)*T5;%时间序列
t5=linspace(0,400,800);
ylv5 = ifft(Ylv4*N);
ylvlv=ylv5(1:5:3996);
ylvlv2=ylvlv';
subplot(3,2,5)
plot(4*t5 ,ylv5(1:5:3996));
%画出第个五图
%上面的这些为了得到一个1*800的数据ylvlv2,已经确认得到就是1*800的矩阵,但是用for以后就不能调用ode45,结果出来就是k未定义
len=length(ylvlv2);
ty=linspace(0,400,len);
y=zeros(1,len);
y(1)=a*y0-b*y0^3+ylvlv2(1)+k*sin(2*pi*0.01*ty(1));

for i=1:len-1
   h=ty(i+1)-ty(i);
    q1=h*(a*y(i)-b*y(i)^3+ylvlv2(i+1)+k*sin(2*pi*0.01*ty(i+1)));
    q2=h*(a*(y(i)+h*k1/2)-b*(y(i)+h*k1/2)^3+ylvlv2(i+1)+k*sin(2*pi*0.01*(ty(i+1)+h/2)));
    q3=h*(a*(y(i)+h*k2/2)-b*(y(i)+h*k2/2)^3+ylvlv2(i+1)+k*sin(2*pi*0.01*(ty(i+1)+h/2)));
    q4=h*(a*(y(i)+h*k3/2)-b*(y(i)+h*k3)^3+ylvlv2(i+1)+k*sin(2*pi*0.01*(ty(i+1)+h)));
    y(i+1)=y(i)+(q1+2*q2+2*q3+q4)/6;
   
end

能再帮忙看看出现什么问题么   灰常感谢   急着用程序
3楼2014-10-28 10:06:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 astonesh 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见