matlab调用龙格库塔法出错In an assignment A(I) = B,the number of eleme

问题描述:

matlab调用龙格库塔法出错In an assignment A(I) = B,the number of elements in B and I must be the
使用RK4求解常微分出错,常微方程如下,h+d=23为常量,欧米茄是已知的数组,共27个元素,程序中用omg定义.θ是定义的等差数组,用seita定义,是自变量,应该也是27个元素,x是应变量.θ初始为0,x为-15 .

function inner = sax(varargin)
clc,clear
h1=8;d=15;l=2000;n=1.4;
h=pi/160;max_omg=30*pi/180;xn=pi/6;y0=0;
seita=[0:pi/160:pi/6];
lk=length(seita);
yt=[0,45.3421,90.6667,135.9563,181.1935,226.3609,271.441,316.4164,361.2699,405.9841,450.5418,494.9258,539.119,583.1043,626.8649,670.3837,713.6442,756.6295,799.3231,841.7086,883.7695,925.4898,966.8532,1007.844,1048.4461,1088.6441,1128.4224]
omg=[0,0.0152,0.0303,0.0454,0.0605,0.0754,0.0902,0.1048,0.1193,0.1336,0.1477,0.1615,0.1752,0.1885,0.2016,0.2144,0.227,0.2392,0.2511,0.262,0.274,0.285,0.2957,0.3061,0.3161,0.3258,0.3353]
global omg;global seita;

[y,x]=lgkt(d,lk,h) ;%调用rk4

function z=f(seita,x) %rk4子函数
global omg;global seita;
h1=8;d=15;n=1.4;
fenzi=h1+d+x;
fenmu=(-(n*cos(omg)-cos(seita))/(n*sin(omg)-sin(seita))-tan(seita)).*((cos(seita)).^2);
z=fenzi./fenmu;%常微分方程
function [seita,x]=lgkt(d,lk,h)
global seita;
x(1)=-d;
y1=seita;
y1(1)=0;
for i=1:(lk-1)
    K1=f(y1(i),x(i));     %x为x左边 y为出射角度θ
    K2=f(y1(i)+h/2,x(i)+h/2*K1);
    K3=f(y1(i)+h/2,x(i)+h/2*K2);
    K4=f(y1(i)+h,x(i)+h*K3);
    x(i+1)=x(i)+h/6*(K1+2*K2+2*K3+K4);
end
y=y1;
plot(x,y)

matlab提示
  In an assignment  A(I) = B, the number of elements in B and
 I must be the same.
Error in ==> axs>lgkt at 31
    x(i+1)=x(i)+h/6*(K1+2*K2+2*K3+K4);
Error in ==> axs at 13
[y,x]=lgkt(d,lk,h) ;
1个回答 分类:数学 2014-09-18

问题解答:

我来补答
我只能说你的程序很乱,一堆没有用到的变量,不知道你在想什么.最关键的是常微分方程的omg不应该是定值吗,也即是说对每一个给定的omg值都有一个常微分方程的解与之对应.我帮你改了一下.仅供参考.
function sax
clc;clear;
h=pi/160;
seita=0:h:pi/6;
x0=-15;
x=lgkt(seita,x0,h);%调用rk4
plot(seita,x)
end
function x=lgkt(seita,x0,h)
y1=seita;
x=zeros(size(y1));
x(1)=x0;
for i=1:length(seita)-1
K1=f(y1(i),x(i));%x为x左边y为出射角度θ
K2=f(y1(i)+h/2,x(i)+h/2*K1);
K3=f(y1(i)+h/2,x(i)+h/2*K2);
K4=f(y1(i)+h,x(i)+h*K3);
x(i+1)=x(i)+h/6*(K1+2*K2+2*K3+K4);
end
end
function z=f(seita,x)%rk4子函数
h1=8;%这里修改
d=15;
n=1.4;
omg=0.2;
fenzi=h1+d+x;
fenmu=(-(n*cos(omg)-cos(seita))/(n*sin(omg)-sin(seita))-tan(seita)).*((cos(seita)).^2);
z=fenzi./fenmu;%常微分方程
end
再问: omg不是定值,当seita变化的时候,omg会变化,x也会变化。 只不过我现在定义了seita为等差数列,每个seita(i)对应一个omg(i),然后我需要求出对应的x(i)。 最后求出来的x应该是从-15增大的。 这是我参考别人的程序第一次在matlab编的。
再答: 如果是这样的话,修改如下。但我是无法理解你这样做到底有什么含义。 function sax clc,clear; h=pi/160; seita=0:h:pi/6; omg=[0,0.0152,0.0303,0.0454,0.0605,0.0754,0.0902,0.1048,0.1193,0.1336,... 0.1477,0.1615,0.1752,0.1885,0.2016,0.2144,0.227,0.2392,0.2511,... 0.262,0.274,0.285,0.2957,0.3061,0.3161,0.3258,0.3353]; x0=-15; x=lgkt(seita,x0,h,omg);%调用rk4 plot(seita,x) end function x=lgkt(seita,x0,h,omg) y1=seita; x=zeros(size(y1)); x(1)=x0; for i=1:length(seita)-1 K1=f(y1(i),x(i),omg(i));%x为x左边y为出射角度θ K2=f(y1(i)+h/2,x(i)+h/2*K1,omg(i)); K3=f(y1(i)+h/2,x(i)+h/2*K2,omg(i)); K4=f(y1(i)+h,x(i)+h*K3,omg(i)); x(i+1)=x(i)+h/6*(K1+2*K2+2*K3+K4); end end function z=f(seita,x,omg)%rk4子函数 h1=8; d=15; n=1.4; fenzi=h1+d+x; fenmu=(-(n*cos(omg)-cos(seita))/(n*sin(omg)-sin(seita))-tan(seita)).*((cos(seita)).^2); z=fenzi./fenmu;%常微分方程 end
再问:                              以上是示意图,粗线与细线的交点就是所求的水平x,一个seita对应一个x对应一个omg。当我求出这些点后,我想输出类似粗线的线性,用什么命令,参数是seita 和x,polar吗?另外我想拟合这些点以获得一条等式或者知道这天弧线的非球面系数该如何解决?
再答: 这条粗线跟omg没关系吧。还有你的x是指交点的横坐标值吗,如果是的话, plot(x,x.*tan(seita))可以把27个点画出,具体的我就不清楚了,你自己再看看吧。
再问: 再问一下,为什么我删除常微分方程-tan(seita)对线性没有影响?
再答: 这个我也不清楚,不好意思
 
 
展开全文阅读
剩余:2000
上一页:课时练P3
也许感兴趣的知识