Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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_Differential Equations - Fatal编程技术网

Matlab 用打靶法求解边值问题时,如何实现猜测修正算法?

Matlab 用打靶法求解边值问题时,如何实现猜测修正算法?,matlab,differential-equations,Matlab,Differential Equations,我有一个边值问题(如下图所示),应该用打靶法来解决。请注意,我在做这个问题时使用的是MATLAB。我很确定,我已经将微分方程从一个二阶微分方程改写成一个一阶微分方程组,并且当x=0时,用割线法正确地逼近了这个微分方程导数的缺失值,但是你可以验证这一点,所以你会确定 我已经用打靶法解决了这个BVP问题,我目前针对这个问题的代码如下: clear, clf; global I; I = 0.1; %Strength of the electricity on the wire L = 0.400;

我有一个边值问题(如下图所示),应该用打靶法来解决。请注意,我在做这个问题时使用的是MATLAB。我很确定,我已经将微分方程从一个二阶微分方程改写成一个一阶微分方程组,并且当x=0时,用割线法正确地逼近了这个微分方程导数的缺失值,但是你可以验证这一点,所以你会确定

我已经用打靶法解决了这个BVP问题,我目前针对这个问题的代码如下:

clear, clf;
global I;
I = 0.1; %Strength of the electricity on the wire
L = 0.400; %The length of the wire
xStart = 0; %Start point
xSlut = L/2; %End point
yStart = 10; %Function value when x=0
err = 5e-10; %Error tolerance in calculations
g1 = 128; %First guess on y'(x) when x=0
g2 = 89; %Second guess on y'(x) when x=0
state = 0;
X = [];
Y = [];

[X,Y] = ode45(@calcWithSec,[xStart xSlut],[yStart g1]');
F1 = Y(end,2);
iter = 0;
h = 1;
currentY = Y;

while abs(h)>err && iter<100
    [X,Y] = ode45(@calcWithSec,[xStart xSlut],[yStart g2]');
    currentY = Y;
    F2 = Y(end,2);
    Fp = (g2-g1)/(F2-F1);
    h = -F2*Fp;
    g1 = g2;
    g2 = g2 + h;
    F1 = F2;
    iter = iter + 1;
end

if iter == 100
    disp('No convergence')
else
    plot(X,Y(:,1))
end
这个程序的问题是,对于微分方程中不同的给定值,我得到的奇怪曲线在物理意义上没有任何意义。例如,我得到的唯一“好”图形是当I=0.1时。此类微分方程的图表如下所示:

clear, clf;
global I;
I = 0.1; %Strength of the electricity on the wire
L = 0.400; %The length of the wire
xStart = 0; %Start point
xSlut = L/2; %End point
yStart = 10; %Function value when x=0
err = 5e-10; %Error tolerance in calculations
g1 = 128; %First guess on y'(x) when x=0
g2 = 89; %Second guess on y'(x) when x=0
state = 0;
X = [];
Y = [];

[X,Y] = ode45(@calcWithSec,[xStart xSlut],[yStart g1]');
F1 = Y(end,2);
iter = 0;
h = 1;
currentY = Y;

while abs(h)>err && iter<100
    [X,Y] = ode45(@calcWithSec,[xStart xSlut],[yStart g2]');
    currentY = Y;
    F2 = Y(end,2);
    Fp = (g2-g1)/(F2-F1);
    h = -F2*Fp;
    g1 = g2;
    g2 = g2 + h;
    F1 = F2;
    iter = iter + 1;
end

if iter == 100
    disp('No convergence')
else
    plot(X,Y(:,1))
end

但是当我设置I=0.2时,我得到一个如下图:

同样,在物理意义上,根据给定的任务,这不应该发生,因为它会变得更热,你越接近所提到的电线的中间。我想计算0.1到20之间的所有I,其中I是电的强度

我有一个理论,它与我的猜测值有关,因此,我的问题是,是否有可能实现一个算法,迫使程序调整猜测值,这样我就可以得到一个物理意义上“正确”的图形?还是不可能做到这一点?如果是,请解释原因

我已经连续好几天为这项任务苦苦挣扎,所以我能从这项任务中得到的一切帮助现在对我来说都是无价之宝


提前谢谢你们帮我摆脱困境

对于
gStart=402.26803
您可以得到
I=0.2
的第二个解决方案。然而,对于
I=0.5
只有值低于-50的振荡溶液。是否存在模型不完全正确的可能性?@LutzL,因为我使用割线方法来近似起始导数
y'(0)
,所以我需要两个猜测值。当你说
gStart=402.26803
时,这只是两个猜测中的一个,还是?对于模型本身,我已经用有限差分法解决了相同的边值问题,在那里我得到了绘制它们时想要得到的精确解。但我想用打靶法获得同样的结果,正如你所看到的,由于某种原因,这更困难。如果你画出从初始到最终导数的函数,你会发现在可计算的范围内,
I=0.2,…,0.5
有极点,而对于较大的值,函数绝对保持负值,即。,最大值为负值。这似乎离一个可解决的问题太远了,以至于我怀疑物理模型中的符号或常数有问题
gStart
是一种类似于
yStart
的解决方案,使用其周围的点400和405来初始化割线方法。@LutzL,您如何知道函数保持绝对负值?你是否通过模型进行了实验,并从实验中得出结论?或者你依赖于一些理论解释吗?是的,正如我所说,为射击函数的输入-输出关系生成图形可以提供这种见解。我不知道为什么两种方法之间存在差异,整合方法的顺序(2对4/5)应该只起到定量作用。