Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 龙格-库塔图_Matlab_Graph_Octave - Fatal编程技术网

Matlab 龙格-库塔图

Matlab 龙格-库塔图,matlab,graph,octave,Matlab,Graph,Octave,我有四阶龙格库塔法的八度代码,但我无法创建图形 dy=@(x,y)-x^2+2*y; f=@(x)exp(x^2/2); a=0; b=2; y=1; y0=1; m=20; h=(b-a)/m; k=0; fprintf('k \t x \t\t y (RK4) \t k1 \t\t k2 \t\t k3 \t\t k4 \n') fprintf('%d \t %f \t %f \t\n', k,a,y); for x=a:h:b-h k1=dy(x,y)*h; k2=dy((x

我有四阶龙格库塔法的八度代码,但我无法创建图形

dy=@(x,y)-x^2+2*y;
f=@(x)exp(x^2/2);

a=0;
b=2;
y=1;
y0=1;
m=20;
h=(b-a)/m;
k=0;


fprintf('k \t x \t\t y (RK4) \t k1 \t\t k2 \t\t k3 \t\t k4 \n')
fprintf('%d \t %f \t %f \t\n', k,a,y);
for x=a:h:b-h
  k1=dy(x,y)*h;
  k2=dy((x+h)/2,(y+k1)/2)*h;
  k3=dy((x+h)/2,(y+k2)/2)*h;
  k4=dy((x+h)/2,(y+k3)/2)*h;
  k=k+1;
  y=y+dy(x,y)*h;
  x=x+h;
  fprintf('%d \t %f \t %f \t %f \t %f \t %f \t %f \t  \n', k,x,y,k1,k2,k3,k4);
end

fprintf('yn= %f \n',RK4("fedo",a,b,y0,m));
fprintf('Eroarea comisa este de ordinul lui %d \n',h^2);
我需要创建一个图表,但我不知道要绘制什么
帮助?

首先,您的fprintf语句中有一个未定义的
RK4
函数,它不允许我们查看您所需的完整打印输出,但您的其他代码正在运行,看起来最后一行只是打印错误估计。让我们看看显示的输出:

k        x               y (RK4)         k1              k2              k3              k4
0        0.000000        1.000000
1        0.100000        1.200000        0.200000        0.119750        0.111725        0.110923
2        0.200000        1.439000        0.239000        0.142900        0.133290        0.132329
3        0.300000        1.722800        0.283800        0.170030        0.158653        0.157515
4        0.400000        2.058360        0.335560        0.201836        0.188464        0.187126
5        0.500000        2.454032        0.395672        0.239153        0.223501        0.221936
6        0.600000        2.919838        0.465806        0.282984        0.264702        0.262873
7        0.700000        3.467806        0.547968        0.334531        0.313187        0.311053
8        0.800000        4.112367        0.644561        0.395237        0.370304        0.367811
9        0.900000        4.870841        0.758473        0.466834        0.437670        0.434754
10       1.000000        5.764009        0.893168        0.551401        0.517224        0.513806
11       1.100000        6.816811        1.052802        0.651431        0.611294        0.607280
12       1.200000        8.059173        1.242362        0.769917        0.722673        0.717948
13       1.300000        9.527007        1.467835        0.910451        0.854712        0.849139
14       1.400000        11.263409       1.736401        1.077341        1.011435        1.004844
15       1.500000        13.320091       2.056682        1.275759        1.197667        1.189858
16       1.600000        15.759109       2.439018        1.511911        1.419200        1.409929
17       1.700000        18.654931       2.895822        1.793243        1.682985        1.671959
18       1.800000        22.096917       3.441986        2.128692        1.997362        1.984229
19       1.900000        26.192300       4.095383        2.528980        2.372340        2.356676
20       2.000000        31.069760       4.877460        3.006976        2.819928        2.801223
这里有很多你可以策划的。但是这里有一个小问题,就是所有的数据都没有保存在任何变量中。它只是打印到屏幕上,然后在RK循环的下一次迭代中被覆盖。例如,程序运行后,您的工作区包含以下变量:

>> whos
Variables visible from the current scope:

variables in scope: top scope

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        a           1x1                          8  double
        b           1x1                          8  double
        dy          1x1                          0  function_handle
        f           1x1                          0  function_handle
        h           1x1                          8  double
        k           1x1                          8  double
        k1          1x1                          8  double
        k2          1x1                          8  double
        k3          1x1                          8  double
        k4          1x1                          8  double
        m           1x1                          8  double
        x           1x1                          8  double
        y           1x1                          8  double
        y0          1x1                          8  double

>> k1
k1 = 4.8775
其中所有变量仅保留最后一个值,
k1
作为示例显示

如果要打印信息,则需要保留要打印的信息。如果我手动将数据复制/粘贴到终端以定义数据变量(忽略第一部分行):

然后我可以画出各种各样的东西,比如
y
vs
k
,或者
y
vs
x
,等等:

绘图(数据(:,1),数据(:,3));所有权(“y vs k”); 图形 绘图(数据(:,2),数据(:,3));标题(“y vs x”)

因此,最大的问题是如何保留数据,从而不依赖于复制/粘贴

倍频程和Matlab变量是数组。在本例中,存储数据的变量是单元素1x1数组,每次迭代都会覆盖它们。另一种方法是为每个变量使用一个向量(就像打印输出一样),并将每次迭代的值存储在不同的向量位置,由
k
索引

我注意到,您打印的一些变量实际上并不是用于每个步骤的变量。例如,对于
k=1
,您打印
x=0.1
,但所有这些值都是使用
k=0
x=0
计算的。然后在打印之前增加
x
k
。因此,可能需要对其中一些细节进行调整,以获得与以下内容相匹配的内容:

由于您正在使用
x
定义步骤,因此可能需要首先将其扩展到数组:

>> x=[a:h:b-h];

>> x'

x =

        0
   0.1000
   0.2000
   0.3000
   0.4000
   0.5000
   0.6000
   0.7000
   0.8000
   0.9000
   1.0000
   1.1000
   1.2000
   1.3000
   1.4000
   1.5000
   1.6000
   1.7000
   1.8000
   1.9000
(注意向量通常是一个行向量,我使用了一个
(转置操作符)使它在这里显示为一个列向量。我在最后也做了同样的操作来存储结果。)

以下重写的RK循环生成的输出与以前的输出非常相似:

x=[a:h:b];

for k = 1:length(x)-1
  k1(k+1) = dy(x(k),y(k))*h;
  k2(k+1) = dy((x(k)+h)/2,(y(k)+k1(k+1))/2)*h;
  k3(k+1) = dy((x(k)+h)/2,(y(k)+k2(k+1))/2)*h;
  k4(k+1) = dy((x(k)+h)/2,(y(k)+k3(k+1))/2)*h;
  y(k+1) = y(k) + dy(x(k),y(k))*h;
end


data = [x',y',k1',k2',k3',k4']

data =

         0    1.0000         0         0         0         0
    0.1000    1.2000    0.2000    0.1198    0.1117    0.1109
    0.2000    1.4390    0.2390    0.1429    0.1333    0.1323
    0.3000    1.7228    0.2838    0.1700    0.1587    0.1575
    0.4000    2.0584    0.3356    0.2018    0.1885    0.1871
    0.5000    2.4540    0.3957    0.2392    0.2235    0.2219
    0.6000    2.9198    0.4658    0.2830    0.2647    0.2629
    0.7000    3.4678    0.5480    0.3345    0.3132    0.3111
    0.8000    4.1124    0.6446    0.3952    0.3703    0.3678
    0.9000    4.8708    0.7585    0.4668    0.4377    0.4348
    1.0000    5.7640    0.8932    0.5514    0.5172    0.5138
    1.1000    6.8168    1.0528    0.6514    0.6113    0.6073
    1.2000    8.0592    1.2424    0.7699    0.7227    0.7179
    1.3000    9.5270    1.4678    0.9105    0.8547    0.8491
    1.4000   11.2634    1.7364    1.0773    1.0114    1.0048
    1.5000   13.3201    2.0567    1.2758    1.1977    1.1899
    1.6000   15.7591    2.4390    1.5119    1.4192    1.4099
    1.7000   18.6549    2.8958    1.7932    1.6830    1.6720
    1.8000   22.0969    3.4420    2.1287    1.9974    1.9842
    1.9000   26.1923    4.0954    2.5290    2.3723    2.3567
    2.0000   31.0698    4.8775    3.0070    2.8199    2.8012
(还要注意,倍频程和matlab从1开始索引,而不是零,因此所有的
k+1


现在,所有数据都存储并保留在单个变量向量或数据数组中,您可以制作任何所需的绘图。建议您查看。

如果您不知道要打印什么,我们怎么能想象您要打印什么?@femaletian,您的第二行到最后一行引用了一个未定义的RK4函数。
x=[a:h:b];

for k = 1:length(x)-1
  k1(k+1) = dy(x(k),y(k))*h;
  k2(k+1) = dy((x(k)+h)/2,(y(k)+k1(k+1))/2)*h;
  k3(k+1) = dy((x(k)+h)/2,(y(k)+k2(k+1))/2)*h;
  k4(k+1) = dy((x(k)+h)/2,(y(k)+k3(k+1))/2)*h;
  y(k+1) = y(k) + dy(x(k),y(k))*h;
end


data = [x',y',k1',k2',k3',k4']

data =

         0    1.0000         0         0         0         0
    0.1000    1.2000    0.2000    0.1198    0.1117    0.1109
    0.2000    1.4390    0.2390    0.1429    0.1333    0.1323
    0.3000    1.7228    0.2838    0.1700    0.1587    0.1575
    0.4000    2.0584    0.3356    0.2018    0.1885    0.1871
    0.5000    2.4540    0.3957    0.2392    0.2235    0.2219
    0.6000    2.9198    0.4658    0.2830    0.2647    0.2629
    0.7000    3.4678    0.5480    0.3345    0.3132    0.3111
    0.8000    4.1124    0.6446    0.3952    0.3703    0.3678
    0.9000    4.8708    0.7585    0.4668    0.4377    0.4348
    1.0000    5.7640    0.8932    0.5514    0.5172    0.5138
    1.1000    6.8168    1.0528    0.6514    0.6113    0.6073
    1.2000    8.0592    1.2424    0.7699    0.7227    0.7179
    1.3000    9.5270    1.4678    0.9105    0.8547    0.8491
    1.4000   11.2634    1.7364    1.0773    1.0114    1.0048
    1.5000   13.3201    2.0567    1.2758    1.1977    1.1899
    1.6000   15.7591    2.4390    1.5119    1.4192    1.4099
    1.7000   18.6549    2.8958    1.7932    1.6830    1.6720
    1.8000   22.0969    3.4420    2.1287    1.9974    1.9842
    1.9000   26.1923    4.0954    2.5290    2.3723    2.3567
    2.0000   31.0698    4.8775    3.0070    2.8199    2.8012