图片缩略图

拍摄方法

版本1.0.1(2.82 kB)by 马丁V。
拍摄方法的实施。它采用区间平分法和龙格-库塔法。
4.6
16评级

59下载

更新2020年5月24日

查看版本历史记录

查看许可证

此代码实现了解决1D边值问题的拍摄方法。
它使用第4顺序的runge-kutta方法来解决ode的ode和区间的分隔方法来查找alpha参数。

引用

马丁诉(2021)。拍摄方法(https://www.mathwands.com/matlabcentral/fileexchange/32451-Shooting-method),Matlab中央文件交换。检索到

评论和评级(68.

马诺·库马尔

是的,先生得到一些错误
???未定义的命令/ f的函数。

错误==>简单bvp>射频在12
dydx = [f(2)

错误在==> bvp4c在207
testODE =函数宏指令(颂歌,x (1), y (: 1), ExtraArgs {:});

错误在==> SimpleBVP在6
索尔= bvp4c (@shootode @shootbc solinit);

马诺·库马尔

嗨,我使用拍摄方法i m me g获取这样的错误
Arning:局部变量的值可能已更改以匹配
全局。未来的Matlab版本要求您宣布
一个在使用变量之前必须是全局变量的变量。
>在NMFM> 28次射击
在bvp4c的207
在NMFM的13岁
???试图访问M(-4);索引必须是一个正整数或逻辑。

错误在==> NMFM>shootode在29
= [f(2)]

错误在==> bvp4c在207
testODE =函数宏指令(颂歌,x (1), y (: 1), ExtraArgs {:});

错误==> nmfm在13
索尔= bvp4c (@shootode @shootbc solinit);

这是我的代码下面。

函数Mvarh
全球M n a pr k lambda;
无穷大= 4;
lambda = 5;
M = 3; D = 0.1; K = 0.1; = 5;公关= 1,N = 1;
Rva=[2 4 6 8];
对于i = 1:3
m = RVA(i);
h1 = 0.1;
线= {'b - ','m - ','g-'};
solinit = bvpinit(linspace(0,∞),[0 1 A]);
索尔= bvp4c (@shootode @shootbc solinit);
η= sol.x;
f = sol.y;
图(1)
绘图(ETA,F(1,:),行{i},'LineWidth',2.5);
xlabel('\ bf \ eta');
ylabel('\ bf''(\ eta)');
传奇(‘\男朋友= 1.1”,\男朋友= 1.07,\男朋友= 1.05);
坚持,稍等
结尾

%---------------------------------------------------------------------

函数dydx = shootode(eta,f)
%EX5OfE ODE函数为例5的BVP教程。
全局M N A Pr D K;
= [f(2)]
F(3)
-(1/1 + 2λ* K *埃塔+ 2 * (1 + K * eta) ^ 1.5 * (f (1) * (3) f - f (2) * (2) + 2 * K * f (3) + 3 * K *λ(1 + 2 * K * eta) ^ 0.5 * (3) * f (3) - M * M (f (2) - a) a ^ 2))
];
%---------------------------------------------------------------------

函数res = shootbc(fa,fb)
全球Pr L A K M
Res = [fa(1)]
FA(2)-1
FB(2)-A
];

e_frog

马丁V。

只有一个点到Gary:尝试调用[x y] = shotom_method(fce,0.001,1e-6,0,1,[1 3],'fd')作为具有示例函数的M文件称为FCE.M.

马丁V。

嗨,加里,谢谢你的评论。你能把你提到的错误贴出来吗?

加里键人

问候马丁,
我尝试使用您建议[x y] = sports_method(fun,0.001,1e-6,0,1,[1 3],'fd')的精确样本方法
但它一直显示没有定义有趣的错误。
我该怎么办?

马丁V。

嗨Ayman Abdelslam。能否提供给我你在ShootingMethod函数中输入的参数?你要解的方程是什么?很遗憾,没有这些信息,我无法帮助你。致以最亲切的问候。马丁

扎abdelslam

谢谢你
这个错误会出现在我身上
使用shotosing_method时出错(第35行)
没有足够的输入参数
我将非常感激任何帮助

哈姆萨HS

非常感谢。
我建议删除shooting_method和RungeKutta中的fun参数。然后将函数fce重命名为fun。

马丁V。

你好Anila Bibi,代码是专为二阶问题。

anila bibi.

请告诉我四阶ODE的代码

马丁V。

嗨tarek,
感谢您对我的代码感兴趣。不幸的是,它仅用于求解单个方程。

TAREK哈利法

亲爱的马丁,
这个代码能解决耦合非线性五方程ODE吗??

马丁V。

亲爱的天羊,谢谢你的评论。这个例子是正确的。你可以结合函数和它的导数的条件。在两个边界点上导数也可能有条件。

刘天洋

亲爱的马丁,
在您的拍摄方法功能中,我不确定有一件事。在使用的示例中,边界条件是y(0)= 1和Y(1)= 3而不是Y(0)= 1和Y'(1)= 3?顺便说一下,谢谢你的代码。
%使用的例子:
%[x y] = shoot_method(有趣,0.001,1e-6,0,1,[1 3],'FD')
%这意味着将解决的BVP ODE描述在函数的乐趣,
百分比(0,1),边界条件y(0)= 1和y'(1)= 3

马丁V。

亲爱的Shaoting,
感谢您对代码的兴趣。
我看看你的问题,似乎符号数学就是问题。我建议将您的问题重写为类似于功能中的FCE.M的函数。您必须从微分方程中表达第一个衍生,并将其放入FCE.M的代码。它可以非常复杂,没有问题,但是,它表达式必须返回一个值。
马丁

sh武

嗨马丁
我正在尝试使用拍摄方法解决BVP,而我对等式和BCS的表达是复杂的。我不知道该怎么办。如果您有兴趣提供一些建议,请附上我的问题设置。

U = 1; a = 2.5; k = 20;
= 0.95; B = 1; p = 0.05;
syms L1 L2 L3 R f(R)
W = u / * (L1 L2 ^ + ^ + L3 ^ a - 3) - u *日志(L1 * L2 * L3) + k / 2 * (L1 * L2 * L3-1) ^ 2;
t1 = diff (W, L1); t2 =简化(diff (W, L2));
L1 = R *差异(f) + f; L2 = f; L3 = f;
t1 = eval (t1); t2 = eval (t2);
eqn = diff (t1, R) + 2 / R * (t1 - t2) = = 0
BC1 = SUMM(T1 / L2 ^ 2,R,A)== 0;
BC2 =潜艇(t2 / L2 ^ 2, R, B) = = p;

陈武

文钊

马丁V。

亲爱的安德烈,
感谢您对我的代码感兴趣。
不幸的是,拍摄方法仅用于一个方程,而不是它们的系统。
亲切的问候
马丁

安德里亚·罗伯托Calore

亲爱的马丁,它能用于9个方程的方程组吗?

Effazera Kohadie

谢谢你,马丁。我现在明白了。现在我试着把龙格-库塔换成欧拉,但我好像有个错误。我会截屏发到你的邮箱。

马丁V。

亲爱的Effazera,
请确保您所在的目录中包含代码的所有m文件。
如果有其他问题,请把你的MatLab的截图发给我,看看你是如何在命令窗口写函数,它的参数和返回的结果。
最好的

Effazera Kohadie

我试着运行你的编码,但我的matlab有一个错误。它说“未定义的函数或变量”射击_method'。“我正在使用Matlab 2016。

BlueEyes

好 - >http://imgbox.com/qfb5ierk.
找到了我的错,你写道:
---------
%fun -函数句柄,fun包含系统的解微分
%方程式,例如让y''+ y = sqrt(x + 1)是解决的差异
%方程式,然后有趣的形状:
%函数out = fce(x,y)
% out(1) = y(2);
%OUT(2)= SQRT(x + 1)-Y(1);
---------
所以,对于Y''+ Y = 0,OUT(2)应该是0 - Y(1)= -Y(1)。伟大的!

肯尼斯•庄

马丁V。

你好,
方程的形状是y''+y = 0。你需要用z代替y的一阶导数,也就是y' = z,然后你需要从方程中表示二阶导数,然后使用替换,因此你有y'' = z' = -y。
这意味着您具有两个差分方程的系统,即:
1) y' = z
2)z'= -y
描述这个系统的m文件有形状

函数输出= fce(x,y)
(1)= y(2);
(2) = - y (1);

希望这个有帮助。

你的m文件描述方程y'' = 0。它的解是线性函数。

BlueEyes

差异或我的错?http://imgbox.com/Jy8hP0Di

BlueEyes

差异或可能出错?http://imgbox.com/Jy8hP0Di

BlueEyes

哦是的!它现在有效。谢谢
http://imgbox.com/Q0VOXraw

马丁V。

问题是功能处理程序。您应该使用@function_name而没有任何参数。
这就是为什么[x y] = shooting_method(@fce,0.001,1e-6,0,1,[1 3],'fd')表现正常,而[x y] = shooting_method(@fce (x,y),0.001,1e-6,0,1,[1 3],'fd')返回错误的原因。

BlueEyes

嗨马丁,
首先,让我说以前的测试(现在的vanessa)在Octave 4.0.0下运行。
新测试行动:
我)文件fce考试。m修改如下,输入新的Vanessa的函数:
--------
函数输出= fce(x,y)
(1)= y(2);
out(2)= exp(x)+ y(1)* cos(x) - (x + 1)* y(2);
--------
ii)交互式窗口:
[x y] = sports_method(@fce(x,y),0.01,1e-6,0,1,[1 3],'FD')
iii)产出
>> [x y] = sport_method(@fce(x,y),0.01,1e-6,0,1,[1 3],'FD')
错误:'x'未定义近线1列29
错误:对参数列表元素1求值
错误:对参数列表元素1求值
iv)功能启动输出(正常工作):
------------------------
> > (x, y) = shooting_method (e-6 @fce, 0.001, 1, 0, 1, 1[3],“fd”)
警告:legend: 'best'还没有实现位置指定符
经过时间为5.70949秒。
X =
第1至8列:
0.00000 0.00100 0.00200 0.00300 0.00400 0.00500 0.00600 0.00700
列9到16:
0.00800 0.00900 0.01000 0.01100 0.01200 0.01300 0.01400 0.01500
............
------------------------
干杯

马丁V。

亲爱的BlueEyes,
感谢您的信息。您是否尝试过vanessa的原始示例或我的更正(截至4月18日的回复)?
您使用的MATLAB版本是什么?我在2011年测试了代码,一切正常。
亲切的问候

BlueEyes

请求马丁,被告知您的示例,显示在主文件的标题上,正常工作,请参阅此屏幕截图http://imgbox.com/rsijscq8.虽然Vanessa的一个仍然失败了。根据要求,我可以上传错误输出。干杯

马丁V。

亲爱的Vanessa,
对不起,我很抱歉,但我有点忙。
我在你的代码中发现了一些错误。首先,描述微分方程组的函数应具有以下形状:

函数输出= fce(x,y)
(1)= y(2);
out(2)= exp(x)+ y(1)* cos(x) - (x + 1)* y(2);

即,对于指数函数,应该有exp而不是e。

其次,尝试通过此声明调用求解器:Shoot_Method(@ FCE,0.01,1E-6,0,1,[1 3],'FF',[-10 10])
也就是说,在函数处理程序fce之前应该有@。

希望这个有帮助。如果您有任何其他问题,请告诉我。

问候

马丁

Vanessa Lowry.

如果我这样调用它,我得到这个错误消息:

ShotoS_Method(FCE(x,y),0.01,1e-6,0,1,[1 3],'ff',[-10 10])
未定义函数或变量“x”。

谢谢

Vanessa Lowry.

玛明恩晚上好:

我继续收到错误消息,如下所示:

ShotoS_Method(乐趣,0.01,1E-6,0,1,[1 3],'FF',[-10 10])
输入参数不足。

有趣的错误(第2行)
(1)= y(2);

函数输出= fce(x,y)
(1)= y(2);
out(2)= e ^ x + y(1)* cos(x) - (x + 1)* y(2);

我的两点BVP是以下内容:
y = e x + y ^ * cos (x) - (x + 1) * y '
Y(0)= 1
Y(1)= 3

任何想法可能导致这件事是什么?

谢谢

文森特tena

马丁V。

嗨r.sch,
乍一看,这似乎是条件(变量con)的问题。你有y(1)但这是函数有趣的一部分。因此,y(1)超出了主程序的范围。你能把你正在解决的问题发送到我的邮箱(martin.veslo@seznam.cz)吗?我会尽量给你更好的答案。
愿一切都好!
马丁

R.Sch.

嗨马丁,
我收到这个错误:
subscript指数必须是真正的正整数或逻辑。

rxnshw9> rungekutta(第96行)错误
k1 =乐趣(x (k), y (:, k));

rxnshw9>shooting_method错误(第39行)
[~, F1] = RungeKutta(a,b,h,a1,fun);

rxnshw9错误(第10行)
out = shotom_method(乐趣,h,zot,a,b,con,类型);

我的代码是:
函数=主要(空白)
Y = [2 2];
有趣= f(y);
h = .1;
零= 1 * 10 ^ -6;
= 0;
b = 1;
类型=“弟弟”;
con = [5 *(y(1) - 。027)0];
out = shotom_method(乐趣,h,zot,a,b,con,类型);
结尾
函数= f (y)
征求= .0168;
km = .00851;
(1)= y(2);
out(2)= 5 *(y(2))+(10 * rmax * y(1))/(km + y(1));
结尾
你知道问题可能是什么吗?
谢谢

马丁V。

亲爱的Najmus,
是的,您可以使用代码来解决您提到的问题。如果对于该函数已知边界条件,则应将参数类型设置为String'FF'。有关更多信息,请查看功能的帮助或与我联系。
祝一切顺利

Najmus Sakib

亲爱的Martin,这段代码是否适用于边值条件,你知道的值是y(a)和y(b),而不是y(a)和y'(b) ?

马丁V。

嗨_theT,
首先,您需要代码f函数f并将其另存为m-file。对于您的问题,该函数将具有以下形状:

功能OUT = F(x,y)
(1)= y(2);
OUT(2)= Y(1)* Y(2) - 12 * Y(1) - 9 * Y(2)
4*x^3 +5*x^2 + 12/13;

然后只需使用必需的参数调用shooting_method。为了解决这个问题,你必须知道你要找的解的区间和两个条件(每个区间都有一个条件)。

有关更多信息,我建议探讨我的功能的帮助。

最好的

马丁

_theT

亲爱的马丁,
感谢您的发布,这是一个超级有用的功能,但我正在努力解决形式的问题:

Y ''= yy' -12y -9y' -4x^3 +5x^2 +12/13

关于如何求出y'并将其代入函数中,你有什么建议吗?
谢谢!

罗马曼扎纳莱斯

亲爱的,这是我试图解决的问题:

Y "=4(Y−x), 0≤x≤1,Y (0) = 0, Y (1) = 2,;一)h = 1/2, b) h = 1/4

解决方案:
Y(x)= e ^ 2(e ^ 4 -1)^( - 1)*(e ^(2x)-e ^( - 2x))+ x。

我真的很感激你的帮助!非常感谢!

马丁V。

亲爱的罗马,
这个问题是在函数f的定义中。由于打射法是为了解决二阶边界问题,函数f必须包含你正在寻找的函数的定义和它的一阶导数。因此,f必须包含定义f(0) = y和f(1) = y'的两行。你能给我提供一下你正在解决的问题吗?
最好的
马丁

罗马曼扎纳莱斯

我收到这个错误:

shooting_method (f、h 1 e-6, xi, x,,类型,[-10;10])
错误使用+
矩阵的维数必须一致。

RungeKutta错误(第9行)
k2 =乐趣(x (k) + 0.5 * h, y (:, k) + 0.5 * h * k1);

shooting_method错误(第56行)
[~, F1] = RungeKutta(a,b,h,a1,fun);

任何事情发生了什么?

这是我的函数
f = @(x,y)(4。*(y-x))

马丁V。

亲爱的瑞克,
尝试在参数Fun之前添加@,即

shooting_method (e-6 @fce, 0.001, 1, 0, 1, 1[3],“fd”,-10[10])。

如果它仍然没有工作,请提交包含微分方程的源代码,即乐趣。

最好的

马丁

瑞克斯

你好,
我得到这个错误消息:

使用fce时出错(第2行)
输入参数不足。

我调用这个方法如下:
shooting_method (e-6 fce考试,0.001,1,0,1,1[3],“fd”,-10 [10])

谁能帮忙吗?

谢谢,
瑞克斯

x呗

亲爱的马丁V,

感谢您对发表的拍摄方法的贡献。我现在用射击的方法来解决一个2点边界问题。系统的运动动力学是
功能dt = funct(t,x)
w = -0.9 / 100;
DX =零(3,1);
dx (1) = cos (x (3)) - w * x (2);
dx(2)= sin(x(3))+ w * x(1);
dx(3)= w。
其中[x(1) x(2)]为状态变量,x(3)为输入控制律。

问题是如何计算初始输入x(3)(t=0),使系统从给定的初始状态[x(1)(t=0) x(2)(t=0)]演化到最终状态[x(1)(t=tf) x(2)(t=tf)],其中两种状态已知,但最终时间tf未知。交易时间tf与初始输入x(3)(t=0)密切相关,甚至耦合。

我认为你的拍摄方法[x y] = sport_method(乐趣,h,零,a,b,con,类型,init)可以解决问题。但是,我只知道与两个州相关的边界条件。因此,我应该如何设置一个,b和shouting_method中的相应配置?

非常感谢您的回复。期待您的回音。

此致,
x呗

兴宇李

马丁V。

嗨海怪”
试着这样键入function:

shooting_method (e-6 @fce, 0.001, 1, 0, 1,[0, 1],“df”)

你是对的,你必须履行。为此,简单地互换A和B值和各自的条件。

马丁

克朗

对不起,我看了这个非常感谢!
类型 - 指定特定点中的边界条件的类型,
%是由2个字符组成的字符串('f'代表function, 'd'代表function
% derivative),例如fd表示在某一点条件是
百分比与功能和B点到衍生物

克朗

你好!
如果边界条件是y(1)=1,则y ' (0)=0
我做不到!
因为a> b

我觉得沮丧

shoot_method(@ fce,0.001,1e-6,1,0,[1 0],'FD')

拜托!我需要你的帮助!

抱歉我的英语能力!

克朗

马丁V。

你好,
请确保所有*。M个文件位于一个目录中。然后尝试调用以下函数之一:

1)设置输出参数:[x y] = shotoft_method(fce,0.001,1e-6,0,1,[1 3],'fd')

2)使用功能句柄与@ sign:shoot_method(@ fce,0.001,1e-6,0,1,[1 3],'fd')

3)不使用隐式参数:
shooting_method (e-6 fce考试,0.001,1,0,1,1[3],“fd”,-10 [10])

4)转置向量有条件:
shole_method(fce,0.001,1e-6,0,1,[1 3]','FD')

此致

马丁

哈穆拉比尼布卡纳扎尔

@martin!感谢您的回复。我实际上只是使用你的原始代码,并在采用它的特定问题之前先尝试一下。我有三个* .m文件,然后键入命令窗口:shourt_method(fce,0.001,1e-6,0,1,[1 3],'FD')。它的回复是:

>> ShotoS_Method(FCE,0.001,1E-6,0,1,[1 3],'FD')
使用FCE时出错(第4行)
输入参数不足。

我用MATLAB R2015a工作。我做错什么了吗?

谢谢你处理这个!!!

马丁V。

@Hamurabi和@jae:
你好,
你能把你的微分方程和包含它的函数的形状发给我吗?(即函数“fce”的源代码)请记住,在我的代码中,二阶微分方程必须转换为两个一阶微分方程的系统。
问候
马丁

嗨@Martin V:我和Jae Shim有同样的问题。它是否与不同的Matlab版本有关?

jae垫片

嗨,当我运行代码时,它会导致错误说明:使用fce时出错(第2行)
输入参数不足。
我调用这个方法如下:
shooting_method (e-6 fce考试,0.001,1,0,1,1[3],“fd”,-10 [10])

我叫错了吗?

马丁V。

到:洪垒
有关乐趣的定义,请查看文件拍摄中的帮助_Method.m。包括它的例子。请注意,有趣的定义必须在单独的文件中(例如,名称FCE.M)。当您拥有此文件时,可以使用参数乐趣= FCE调用shourt_method。

洪堡

我们如何在这里定义有趣?

马丁V。

尝试输入“shooting method for 3rd order problem”到谷歌。有一些文章和代码用不同的编程语言编写。

阿卜杜勒哈南谢赫

感谢您的及时回复,
对于三阶ODE有什么指导方针吗?

马丁V。

不,代码是专为二阶问题设计的。

阿卜杜勒哈南谢赫

我们可以将此应用于第三订单Wellposted Ode吗?
谢谢,

悲伤的DSD

很好

MATLAB版本兼容性
用R2010B创建
与任何版本兼容
平台兼容性
窗户 macOS Linux.

社区寻宝

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!