用Matlab求解一个六阶非线性微分方程
24次浏览(过去30天)
显示旧的注释
大家好,
我正试图解一个高阶非线性微分方程
:
作为边界条件,我有以下几个条件:
我试着用一种射击法算法来解这个方程
,我把它转换成一阶微分方程的形式如下:
:
根据边界条件,有:
我们要猜剩下的几个:
我在我的帖子中附上了我写的算法,它受到传记研究的启发:主要代码称为“shoot4nl”。m”,我试着猜测一些初始值,以便运行算法。我还选择了一个值
非常“高”,以匹配条件……
通过这样做,我得到以下错误:
警告:矩阵为奇异的工作精度。
在newtonRaphson2中(第23行)
在射击4(第14行)
错误使用newtonRaphson2
太多次迭代
错误在shoot4n1(第14行)中
u = newtonRaphson2(@residual,u);
我认为这意味着在这个过程中会出现一个除以0的情况,但我仍然不知道如何解决这个问题……
有没有人能帮我一下,或者把他的数学专业知识带来给我一些提示?
提前谢谢你,
致以最亲切的问候。
2的评论
Wissem-Eddine KHATLA
2022年4月7日
答案(2)
Torsten
2022年4月6日
编辑:Torsten
2022年4月6日
我认为,如果有经过良好测试的MATLAB替代品,这个论坛中没有人会潜入自制软件。
所以这几行代码可以让你开始使用专业软件:
b0 = [1 1 1 1];
BC = fsolve(@fun,bc0);
F0 = [1 -5;0;bc(1);bc(2);bc(3);bc(4)]
[-10,10];
[eta,F] = 0 (@fun_ode,etaspan, 0);
情节(η,F (: 1))
函数Res =乐趣(bc)
F0 = [1e-5;0;bc(1);bc(2);bc(3);
Etaspan = [- 10,0,10];
[eta,F] = 0 (@fun_ode,etaspan, 0);
res(1) = F(2,2);
res(2) = F(2,4);
res(3) = F(3,1);
res(4) = F(3,2);
结束
函数dfdelta = fun_ode(eta,F)
dFdeta = [F (2), (3); F (4), F (5), F (6); (1/9 * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3];
结束
30的评论
Wissem-Eddine KHATLA
2022年4月6日
@Torsten
再次感谢您的帮助。我试过使用bvp4c内置函数,但没有成功,所以我回到了我自己的函数…
不幸的是,我没有理解你的函数“res”的目的。因为“etaspan”没有按照我对ode45解算器的预期建造?另外:像这样定义“bc”的目的是什么?
提前谢谢你。
致以最亲切的问候。
Torsten
2022年4月6日
Res定义了在eta = 0和eta = eta0处拍摄方法的残差:
res(1) = F(2,2)是F'在eta = 0时与0的偏差
res(2) = F(2,4)是F''在eta = 0时与0的偏差
res(3) = F(3,1)是F在eta = eta0时与0的偏差
res(4) = F(3,2)是F'在eta = eta0时与0的偏差
fsolve试图调整F', F'', F'''', F'''''在eta = -eta0处的初始条件,使eta = 0和eta = eta0处的规定条件成立。
不同于你的设定,积分开始于= - a0,而不是= 0。
Wissem-Eddine KHATLA
2022年4月6日
@Torsten
你认为在这种情况下我们如何调整积分的步长?因为,在运行脚本时,我得到以下错误:
警告:失败t = -9.999884 e + 00。如果不减少步长,就无法满足集成公差
大小低于时刻t允许的最小值(2.842171e-14)。
例如,我曾经在之前的脚本中手动执行此操作。
谢谢
Wissem-Eddine KHATLA
2022年4月6日
我想精确地调整步长,因为我在Matlab上得到了一个错误:
警告:失败t = -9.999884 e + 00。如果不减少步长,就无法满足集成公差
大小低于时刻t允许的最小值(2.842171e-14)。
似乎解算器不能有效地调整它?或者可能是Matlab和Octave中的两个求解器之间的区别。
Torsten
2022年4月6日
编辑:Torsten
2022年4月6日
下面的代码可以工作,例如:,和gives the included solution for F:
Bc0 = [2.2504e+06 -2.5004e+05 -2.2123e+06 5.6616e+05]
Etaspan = [-30 30];
BC = fsolve(@(BC)fun(BC,etaspan),bc0);
bc(1);bc(2);bc(3);
选项= odeset()“InitialStep”1 e-9);%, ' MaxOrder ', 1);
[eta,F] = ode45(@fun_ode,etaspan,bc_total);%,选项);
情节(η,F (: 1))
函数Res = fun(bc,etaspan)
bc(1);bc(2);bc(3);
etasp_ode = [etaspan(1),0,etaspan(2)];
选项= odeset()“InitialStep”1 e-9);%, ' MaxOrder ', 1);
[eta,F] = ode45(@fun_ode,etaspan_ode,bc_total);%,选项);
res(1) = F(2,2);
res(2) = F(2,4);
res(3) = F(3,1)-1e-7;
res(4) = F(3,2);
结束
函数dfdelta = fun_ode(eta,F)
dFdeta = [F (2), (3); F (4), F (5), F (6); (1/9 * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3];
结束
Wissem-Eddine KHATLA
2022年4月7日
没有找到解决方案。
fsolve已停止,因为当前步骤的相对大小小于
价值步长公差的平方,但函数值的向量
是不接近零的测量值的功能公差。
<停止标准详细信息>
我第一次尝试你的脚本直接,但后来我改变了一些值对bc0:它没有提供任何结果…
你能花点时间解释一下你对之前的更正所做的修改吗?
提前谢谢你,
致以最亲切的问候。
Wissem-Eddine KHATLA
2022年4月7日
编辑:Wissem-Eddine KHATLA
2022年4月7日
@Torsten
我仍然对“fsolve”内置功能有一些问题,不知道背后的原因是什么……我还在想办法。
Wissem-Eddine KHATLA
2022年4月7日
@Torsten
你的意思是,为了避免+/-inf条件,把变量变成别的东西会更方便?
此外,您获得的形状是预期的形状。我不明白为什么我一直面对这个关于“解决”的错误,我试图在八度上运行,我也有一个错误。我错过了一些东西。
Torsten
2022年4月7日
编辑:Torsten
2022年4月7日
我试图为bvp4c设置问题,但我无法测试它-因此可能存在错误以及求解器不成功。
代码应该看起来像
Eta0 = 30;
Etamesh = [linspace(-eta0,0,100),linspace(0,eta0,100)];
Finit = [1.0e-7;0;0;0;0;0);
solinit = bvpinit(etamesh,Finit)
Sol = bvp4c(@fun_ode, @bc, solinit);
情节(sol.x sol.y (:))
函数dfdelta = fun_ode(eta,F,region)
dFdeta = [F (2), (3); F (4), F (5), F (6); (1/9 * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3];
结束
函数res = bc(FL,FR)
res = [FL(1,1) - 1.0e-7;FL (2, 1);...
FR (2, 1);FR (4,1);...
FR (1, 1) fl(1、2);FR (2, 1) fl (2, 2);FR (3,1) fl (3 2);FR (4,1) fl (4,2);FR(5、1)fl (5, 2);FR (6,1) fl (2);...
FR(1,2) - 1.0e-7;FR (2, 2)];
结束
Wissem-Eddine KHATLA
2022年4月7日
@Torsten
我目前使用的版本是6.3.0。更准确地说,我得到这个错误:
错误:无效调用到script /Users/ wise -eddine/Documents/MATLAB/fun.m
错误:从
有趣的
/私人/ var /文件夹/ 4 g / s18zdpyn2s5bfgr15s40n21c0000gn / T / / octave_VINHsb八度。m b> @<匿名b>在行3列18
fsolve在第242行第8列
Torsten
2022年4月7日
使用下面的代码,将其命名为“main”。M”,在八度编辑器中加载并运行它。
函数主要
Bc0 = [2.2504e+06 -2.5004e+05 -2.2123e+06 5.6616e+05]
Etaspan = [-30 30];
BC = fsolve(@(BC)fun(BC,etaspan),bc0);
bc(1);bc(2);bc(3);
选项= odeset()“InitialStep”1 e-9);%, ' MaxOrder ', 1);
[eta,F] = ode45(@fun_ode,etaspan,bc_total);%,选项);
情节(η,F (: 1))
结束
函数Res = fun(bc,etaspan)
bc(1);bc(2);bc(3);
etasp_ode = [etaspan(1),0,etaspan(2)];
选项= odeset()“InitialStep”1 e-9);%, ' MaxOrder ', 1);
[eta,F] = ode45(@fun_ode,etaspan_ode,bc_total);%,选项);
res(1) = F(2,2);
res(2) = F(2,4);
res(3) = F(3,1)-1e-7;
res(4) = F(3,2);
结束
函数dfdelta = fun_ode(eta,F)
dFdeta = [F (2), (3); F (4), F (5), F (6); (1/9 * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3];
结束
Wissem-Eddine KHATLA
2022年4月8日
@Torsten
感谢您对bvp4c脚本的贡献:我想知道它是否更容易用于我的目的。然而,我想完全理解第一个脚本,因为我一直遇到“fsolve”错误:
- 为什么选择在函数中计算4个残差?
函数Res = fun(bc,etaspan)
因为我们“只”需要检查F=F'=0在eta0(和-eta0之后)
- 我明白这句话的目的:
BC = fsolve(@(BC)fun(BC,etaspan),bc0);
然而,我不熟悉这种语法(匿名函数):为什么你选择这样写?
再次感谢楼主的分享和帮助,
致以最亲切的问候。
Torsten
2022年4月8日
编辑:Torsten
2022年4月8日
为什么选择在函数中计算4个残差?
正如我已经试图向您解释的那样,我从eta = -eta0 (F = F' = 0)的两个条件开始ode积分器,并对F'',F'',F''''和F'''''的剩余四个初始条件进行估计。你定义了另外四个条件(两个在0处,两个在= eta0处)应该成立。所以我们有四个值需要消去,即F' = F'' =0在=0时F = F' =0在=eta0时。这是需要求解的四个方程。在res向量中,错误被返回到fsolve,并提示为F " (-eta0),…,F'''''(-eta0)提供更好的猜测,以消除这些错误。
- 我明白这句话的目的:
BC = fsolve(@(BC)fun(BC,etaspan),bc0);
然而,我不熟悉这种语法(匿名函数):为什么你选择这样写?
“fun”中需要“etaspan”来定义ode积分器的积分间隔。这条线
BC = fsolve(@(BC)fun(BC,etaspan),bc0);
具有将“etaspan”作为可在函数中使用的附加参数传递给“fun”的效果。如果你不喜欢这样,你将不得不在调用函数和“fun”中同时更改“etaspan”,如果你更改了eta0。
我非常希望“bvp4c”能比我提供的ad-hoc拍摄方法更稳定地解决你的问题。你已经在MATLAB中测试过我给你的代码了吗?
Wissem-Eddine KHATLA
2022年4月8日
@Torsten
谢谢你的解释。我往往会忘记我的问题是一个“3分问题”……
我试过你的“bvp4c”脚本:它给出了一个错误,说明遇到一个奇异矩阵:
错误使用bvp4c(第197行)
不能求解配置方程——遇到一个奇异雅可比矩阵。
错误在shoot7n1(第5行)
Sol = bvp4c(@fun_ode, @bc, solinit);
我认为这肯定是由于初始条件值。
Wissem-Eddine KHATLA
2022年4月8日
@Torsten
你是否知道相同的代码在八度上运行良好,但一直告诉我在MATLAB中有一个错误??
没有找到解决方案。
fsolve已停止,因为当前步骤的相对大小小于
价值步长公差的平方,但函数值的向量
是不接近零的测量值的功能公差。
Wissem-Eddine KHATLA
2022年4月8日
@Torsten
你有什么建议来避免这种错误吗?因为我还在尝试通过修改etaspan和b0来解决它,但是我还没有成功。我想充分了解它,供MATLAB使用。再次感谢你。
Torsten
2022年4月8日
编辑:Torsten
2022年4月8日
由于我没有MATLAB可用,我无法测试。
但是这个设置(eta0 = 30, F(eta0)=1e-7)对于求解者来说已经很困难了。从不那么激进的值开始(eta0 = 10, F(eta0) = 1e-3或其他)。如果成功,使用该解作为初始值,使eta0变大,F(eta0)变小。
但同样在OCTAVE下,计算非常不稳定,eta0和F(eta0)的微小变化会导致eta=0时高度的巨大变化。虽然您得到了奇异雅可比矩阵的错误消息,但您应该使用我给您的代码尝试bvp4c或bvp5c。一般来说,用有限差分法求解边值问题要比射击稳定得多。
在有限区间内求解(如[-1:1],通过坐标变换eta~ = tanh(eta))可以稳定计算。
不知怎么的,我觉得问题的表述中缺少了一个条件。如果从x=0开始积分,有三个条件(因为我认为解与=0对称)即F'(0)=F'' (0)=F'''''(0)=0。另外,在无穷远处有两个条件:F(无穷)= F'(无穷)= 0。但第六个必要条件是什么?
Torsten
2022年4月9日
编辑:Torsten
2022年4月9日
你认为这是一个很好的数值公式吗?
你知道这是一个完全不同的问题吗?旧公式的结果在eta = 0时给出了约为1e6的值。现在你规定F = 1在= 0时。你认为这两个公式除了基本的微分方程之外还有什么共同之处吗?
这应该是重新表述问题的正确代码,但它不收敛:
Bc0 = [-2.5004e+05 -2.2123e+06 5.6616e+05]
Etaspan = [0 10];
BC = fsolve(@(BC)fun(BC,etaspan),bc0);%在eta = eta0时调整F'',F'''',F'''''的初始条件
b_total = [1;0;bc(1);0;bc(2);
[eta,F] = ode45(@fun_ode,etaspan,bc_total);
情节(η,F (: 1))
%为拍摄方法创建残差
函数Res = fun(bc,etaspan)
b_total = [1;0;bc(1);0;bc(2);
etasp_ode = [etaspan(1),etaspan(2)];
[eta,F] = ode45(@fun_ode,etaspan_ode,bc_total);
res(1) = F(end,1)-1e-2;%在eta = eta0时F与0的偏差
res(2) = F(end,2);%在eta = eta0时F'与0的偏差
res(3) = F(end,3);在eta = eta0时F''与0的偏差%
结束
% 1- 1阶ODE系统
函数dfdelta = fun_ode(eta,F)
dFdeta = [F (2), (3); F (4), F (5), F (6); (1/9 * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3];
结束
Wissem-Eddine KHATLA
2022年4月9日
@Torsten
,
我在之前的帖子中犯了一个错误:我正在听从你的建议,试图解决问题
只间隔。在这种情况下,我引入了一个新的边界条件,如:
我认为这是解决问题的唯一方法,因为正如你所注意到的:用OCTAVE获得的解决方案真的不稳定。在= 0处的解值非常重要,所以我需要一个可靠的方法来确定它。
以下是对脚本的修改:
%主脚本的拍摄方法
b0 = [2.2504e+06 2.212e3 -6 5.6616e-05];
Etaspan = [0 10];
BC = fsolve(@(BC)fun(BC,etaspan),bc0);%在eta = eta0时调整F'',F'''',F'''''的初始条件
b_total = [bc(1);0;bc(2);0;
[eta,F] = ode45(@fun_ode,etaspan,bc_total);
情节(η,F (: 1))
%为拍摄方法创建残差
函数Res = fun(bc,etaspan)
b_total = [bc(1);0;bc(2);0;
etasp_ode = [etaspan(1),etaspan(2)];
[eta,F] = ode45(@fun_ode,etaspan_ode,bc_total);
res(1) = F(end,1)-1e-2;%在eta = eta0时F与0的偏差
res(2) = F(end,2);%在eta = eta0时F'与0的偏差
res(3) = F(end,3);在eta = eta0时F''与0的偏差%
结束
% 1- 1阶ODE系统
函数dfdelta = fun_ode(eta,F)
dFdeta = [F (2), (3); F (4), F (5), F (6); (1/9 * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3];
结束
总是有一个错误……
我还要试试我以前的配方
),但
这是一个很难解决的问题……
再次感谢你。
Torsten
2022年4月9日
编辑:Torsten
2022年4月9日
在= 0处的解值非常重要,所以我需要一个可靠的方法来确定它。
我不想打击您的信心,但是对旧代码的实验表明,eta=0处的值与所选择的eta0有很大的关系。
这在OCTAVE下工作:
b =[3.8309 0.4494 -0.1066];
Etaspan = [0 12];
BC = fsolve(@(BC)fun(BC,etaspan),bc0);%在eta = eta0时调整F'',F'''',F'''''的初始条件
b_total = [bc(1);0;bc(2);0;
选项= odeset()“InitialStep”1 e-9);
[eta,F] = ode45(@fun_ode,etaspan,bc_total,options);
公元前
情节(η,F (: 1))
结束
%为拍摄方法创建残差
函数Res = fun(bc,etaspan)
b_total = [bc(1);0;bc(2);0;
etasp_ode = [etaspan(1),etaspan(2)];
选项= odeset()“InitialStep”1 e-9);
[eta,F] = ode45(@fun_ode,etaspan_ode,bc_total,options);
res(1) = F(end,1)-1e-5;%在eta = eta0时F与0的偏差
res(2) = F(end,2);%在eta = eta0时F'与0的偏差
res(3) = F(end,3);在eta = eta0时F''与0的偏差%
结束
% 1- 1阶ODE系统
函数dfdelta = fun_ode(eta,F)
% F
dFdeta = [F (2), (3); F (4), F (5), F (6); (1/9 * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3];
结束
Wissem-Eddine KHATLA
2022年4月9日
编辑:Wissem-Eddine KHATLA
2022年4月9日
@Torsten
我还想问你的“bvp4c”脚本中内置的残余函数“bc”是如何的?更准确地说:我不明白为什么我们需要精确的两个输入(FL和FR) ?
函数res = bc(FL,FR)
res = [FL(1,1) - 1.0e-7;FL (2, 1);...
FR (2, 1);FR (4,1);...
FR (1, 1) fl(1、2);FR (2, 1) fl (2, 2);FR (3,1) fl (3 2);FR (4,1) fl (4,2);FR(5、1)fl (5, 2);FR (6,1) fl (2);...
FR(1,2) - 1.0e-7;FR (2, 2)];
结束
附注:你们有一个“bvpinit”包给OCTAVE建议吗?
再次感谢你。
Torsten
2022年4月9日
bvp4c或bvp5c不是OCTAVE软件的一部分。
这个例子展示了如何设置必须在内部网格点设置中间条件的问题(例如在区间[-eta0,eta0]上的积分在eta=0处):
“bvpinit”不是一个包——它只是一个函数,用来为BVP设置初始条件。它不会帮你这么做,它只是给你提供了一种可能性,把它作为一个常数,或者通过一个函数,你可以根据eta设置值。
Wissem-Eddine KHATLA
2022年4月9日
@Torsten
感谢您的参考:的确,这个案例在MATLAB的文档部分没有详细介绍。另外,你在这个解算器中遇到过这个错误吗?
错误使用bvp4c(第197行)
不能求解配置方程——遇到一个奇异雅可比矩阵。
谢谢你!
Wissem-Eddine KHATLA
2022年4月10日
编辑:Wissem-Eddine KHATLA
2022年4月10日
@Torsten
我尝试了bvp4c求解器使用拍摄方法的结果:它似乎不能很好地使用以下代码:
%求解方法采用bvp4c求解器
%边界条件:F (0) = F (0) = F”的(0)= 0 (eta0) = F (eta0) = F”(eta0) = 0
Eta0 = 20;
Eta = linspace(0,eta0,100);
Yinit = [3.3517;0;0.5079;0;0.1194;0];OCTAVE ode45集成的%解决方案
Solinit = bvpinit(eta, init);
Sol = bvp4c(@fun_ode, @bcfun, solinit);
Eta = sol.x;
F = sol.y(1,:);
数字
情节(埃塔(F);
函数dF = fun_ode(eta,F)
dF = [F (2);
F (3);
F (4);
F (5);
F (6);
(1/9 *(5 *(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3);
结束
函数Res = bcfun(ya,yb)
res =[丫(2);丫(4);丫(6);yb (1);yb (2);yb (3)];
结束
另一位用户建议我这个问题并不棘手:我很困惑,因为文献中有一个类似的方程,所以我认为我仍然有可能解决它。
谢谢你!
布鲁诺陈德良
2022年4月9日
使用bvp4c
Eta0 = 10;
Eta = linspace(0,eta0,100);
[0;0;0;0];
Solinit = bvpinit(eta, init);
Sol = bvp4c(@fun_ode, @bcfun, solinit);
Eta = sol.x;
F = sol.y(1,:);
情节(埃塔(F);
函数dF = fun_ode(eta,F)
dF = [F (2);
F (3);
F (4);
F (5);
F (6);
(1/9 *(5 *(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3);
结束
函数Res = bcfun(ya,yb)
res =[丫(2);% F (0)
丫(4);% F”(0)
丫(6);% F”“(0)
yb (1:3)];% F(eta0), F'(eta0), F'(eta0),
结束
79条评论
Torsten
2022年4月10日
如果你运行Bruno的代码,结果是一样的吗
res =[丫(2);% F (0)
丫(4);% F”(0)
丫(6);% F”“(0)
yb (1:3)];% F(eta0), F'(eta0), F'(eta0),
取而代之的是
res =[丫(2);丫(4);丫(6);yb (1);yb (2);yb (3)];
?
Wissem-Eddine KHATLA
2022年4月10日
布鲁诺陈德良
2022年4月10日
编辑:布鲁诺陈德良
2022年4月10日
这似乎汇聚在我的个人电脑(R2022a,英特尔),但不是在TMW服务器。
我迭代eta span(以日志方式),并希望前一步的解决方案是一个很好的起点。
Eta0 = 20;
Yinit = [3.3517;0;0.5079;0;0.1194;0];
Nbiter = 10;
eta0 = logspace(0,log10(eta0),nbiter);
为k = 1: nbiter
Eta = linspace(0,eta0tab(k),100);
Solinit = bvpinit(eta, init);
Sol = bvp4c(@fun_ode, @bcfun, solinit);
Eta = sol.x;
F = sol.y(1,:);
= sol.y(:,1);;
结束
情节(埃塔(F);
函数dF = fun_ode(eta,F)
dF = [F (2:6);
(1/9 *(5 *(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3);
结束
函数Res = bcfun(ya,yb)
Res =[ya([2 4 6]);yb (1:3)];
结束
Wissem-Eddine KHATLA
2022年4月10日
@Bruno陈德良
关于这个问题的棘手性,我想你可能是对的。然而,你最后的绘图提供了良好的形状(良好的值?)选择“yinit”有很强的依赖性……
另外,你能告诉我为什么你要这样写残差吗?
Res =[ya([2 4 6]);yb (1:3)];
再次感谢你。
布鲁诺陈德良
2022年4月10日
“然而,你最后的绘图提供了良好的形状(良好的值?)。”
我不确定你说的“外形好”和“性价比高”是什么意思。我不知道解析解,也不知道其他5个导数值是如何正确匹配的。对五阶导数施加条件简直是疯了。导数是一个非常不稳定的算子,取它5 / 6次,对它进行计算是没有希望的。
“选择‘yinit’有很强的依赖性……
因为非线性,我已经告诉过你们了。
当更多的算法告诉雅可比矩阵是奇异的,它只是表明问题是病态的,最终状态(或至少它的一些子空间)对初始状态的依赖在数字上是零。这可能是由于您的问题是严重的规模(对于大eta0 >> 1,正如我上面所说的)或在您试图解决的问题的本质。
另外,你能告诉我为什么你要这样写残差吗?
Res =[ya([2 4 6]);yb (1:3)];
从bc你告诉我们,如果你错过了我的评论在这里的第一个代码
res =[丫(2);% F (0) = 0
丫(4);% F”(0)= 0
丫(6);% F”“(0)= 0
yb (1:3)];% F(eta0)=0, F'(eta0)=0, F'(eta0)=0,
Wissem-Eddine KHATLA
2022年4月11日
编辑:Wissem-Eddine KHATLA
2022年4月11日
@Bruno陈德良
这是从所谓的“润滑理论”中描述高度场的方程推导出来的:高阶是因为我们考虑了一个4阶的压力分量。
物理问题涉及间隔上的6 BC
它们是:
%求解方法采用bvp4c求解器
%边界条件:F (0) = F (0) = F”的(0)= 0 (eta0) = F (eta0) = F”(eta0) = 0
Eta0 = 40;
[1;0;0.5079;0;0.1194;0];bvpinit解算器的初始条件。
Nbiter = 10;%迭代次数。
我们选择以对数尺度迭代eta的值
我们使用bvp4c求解器对相应的ODE进行积分
eta0 = logspace(0,log10(eta0),nbiter);
为k = 1: nbiter
Eta = linspace(0,eta0tab(k),100);
Solinit = bvpinit(eta, init);
Sol = bvp4c(@fun_ode, @bcfun, solinit);
Eta = sol.x;
F = sol.y(1,:);
yit = sol.y(:,1);
结束
我们绘制结果
情节(η,- f);
我们构造一个1阶ODE的向量
函数dF = fun_ode(eta,F)
dF = [F (2:6);
(1/9 *(5 *(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3);
结束
我们用y(b)-a = 0建立该方法的残差。
函数Res = bcfun(ya,yb)
Res =[ya([2 4 6]);yb (1:3)];
结束
谢谢你的帮助。
Torsten
2022年4月11日
这是从所谓的“润滑理论”中描述高度场的方程推导出来的:高阶是因为我们考虑了一个4阶的压力分量。
你能给我一个参考书目链接吗?
前面的代码给出了一个类似于预期的形状,但我不知道如何为我的问题添加新的约束,以减少最终结果与初始猜测或值之间的依赖关系
η
.
所以对于固定的eta0,你得到不同的收敛“解”,但是不同的初始猜万博 尤文图斯测?
Wissem-Eddine KHATLA
2022年4月12日
@Torsten
当然可以:你可以找到这篇文章的附件。导出问题的方程为第二页的方程(Eq.1),并给出了边界条件的详细信息。我希望它能帮助理解我的问题的数学形式。
Wissem-Eddine KHATLA
2022年4月12日
@Bruno陈德良
本文的作者提出了一种与我不同的解决方案。我已经操作了变量变化:
与
.因此,通过在笛卡尔框架中将这种形式注入到前面的完整(方程1)中,我们得到了我的帖子的原始方程。总之,BC
F
是由
h
.
布鲁诺陈德良
2022年4月12日
正如你在问题中所述,它出现在颂歌中
警告:矩阵为奇异的工作精度。
在newtonRaphson2中(第23行)
在射击4(第14行)
以及MATLAB下的
sol = bvp5c(@(xi,G) fun_ode(xi,G,etascale), @bcfun, solinit);
错误使用bvp5c
不能求解配置方程——遇到一个奇异雅可比矩阵
Wissem-Eddine KHATLA
2022年4月12日
编辑:Wissem-Eddine KHATLA
2022年4月12日
@Torsten
不幸的是,在这种情况下:这是不可能的……但它确实会使问题更容易写出来。
布鲁诺陈德良
2022年4月12日
编辑:布鲁诺陈德良
2022年4月12日
@Wissem-Eddine KHATLA
但为什么你更喜欢重新测量大爆炸型t^- β *x和大冷尺度t^ α,而不是像论文作者建议的那样行波xi = (x -c *t)/Lp ?
布鲁诺陈德良
2022年4月13日
编辑:布鲁诺陈德良
2022年4月13日
然后有一段代码,我不太确定它要演示什么。在我这边,我得到了这个结果
Eta0 = 40;
Finit = [1;0;0.5079;0;0.1194;0]
...
我不明白的是这篇论文的作者在xi ->无穷时施加了bc F=1,这意味着解收敛的稳定状态是恒定厚度h0,这在物理上是有意义的。在你的情况下,没有这样的事情,解决方案可以是正的或负的(bc都是0),通常时间数万博 尤文图斯值解决方案返回负的解决方案,正如Torsen已经注意到的F=0也是一个解决方案。我不知道你是怎么用你的奇怪的强非线性重参数化x*t^-来解释它的。
布鲁诺陈德良
2022年4月13日
你的系统似乎有多种解决方案,而且不稳定。万博 尤文图斯在我看来,这不是一个数值问题,而是一个病态问题。有时这样的系统是由能量最小平衡导出的,当我们单独考虑方程时,能量最小平衡就丢失了。也许你应该回到能量公式。
Wissem-Eddine KHATLA
2022年4月15日
- 实验常数一个
- 约束:施加在体积上的约束,产生一个新的方程:
这两个
一个
和
问
是已知的。因此,我得到这两个方程作为ODE的系统来实现:
- :
我只是在最后一行中将第二个方程添加到ODE的系统中
dF = [F (2:6);
(1 / (9 *)) * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3;F (1)];
边界条件仍然相同:
我只是在积分上加上一个条件
我想这就得到了一个适定的问题。
如果我测试修改后的代码:A = Q = 1:我得到一个绘图。然而,如果我选择应用A和Q的真实值:代码再次崩溃……
在[0;eta0]区间内求解弹性区域内弹性液滴的扩散问题
%求解方法采用bvp4c求解器
%边界条件:F (0) = F (0) = F”的(0)= 0 (eta0) = F (eta0) = F”(eta0) = 0
%对卷的约束
Eta0 = 50;
[1];0;0.5079;0;0.1194;0;1);bvpinit解算器的初始条件。
%yinit = [0.25;0;1;0;0.5;0;1];
Nbiter = 10;%迭代次数。
我们选择以对数尺度迭代eta的值
我们使用bvp4c求解器对相应的ODE进行积分
eta0 = logspace(0,log10(eta0),nbiter);
为k = 1: nbiter
Eta = linspace(0,eta0tab(k),100);
Solinit = bvpinit(eta, init);
Sol = bvp5c(@fun_ode, @bcfun, solinit);
Eta = sol.x;
F = sol.y(1,:);
yit = sol.y(:,1);
结束
%我们绘制结果[F;[F]在一个新的数字
图()
情节(η,- f,“- - -”,“线宽”2);
网格在
持有在
情节(η,sol.y (2:)“线宽”, 2)
传奇(“F”,“F”,“位置”,“东北”)
包含(“\埃塔”,“字形大小”13);
ylabel (“(\η),F (\ eta)”,“字形大小”, 13)
我们首先构造一个1阶ODE的向量
最后一个是约束项
函数dF = fun_ode(eta,F)
A = 1;% 3.7926 e;实验常数
dF = [F (2:6);
(1 / (9 *)) * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3;F (1)];
结束
我们用y(b)-a = 0建立该方法的残差。
函数Res = bcfun(ya,yb)
Q = 1;% 0.4 e-9;%实验流速(m^3/s)
Res =[ya([2 4 6]);yb (1:3);yb (7) - q);
结束
你们对这个问题有什么想法吗?我的修改写对了吗?还是我的配方又出了问题?
布鲁诺陈德良
2022年4月15日
编辑:布鲁诺陈德良
2022年4月15日
这段代码不会因为你的实验数据而崩溃,但是有一个警告。实际上你的系统是6阶的(假装是7阶的)你想施加6bc + 1积分约束,它不能满足所有的条件。
清晰的
关闭所有
在[0;eta0]区间内求解弹性区域内弹性液滴的扩散问题
%求解方法采用bvp4c求解器
%边界条件:F (0) = F (0) = F”的(0)= 0 (eta0) = F (eta0) = F”(eta0) = 0
%对卷的约束
Eta0 = 50;
A = 3.7926e-7;
Q = 0.4e-9;
%Finit = [1;0;0.5079;0;0.1194;0;1);bvpinit解算器的初始条件。
有限扩散= [-1.0513 e + 04; 0, 158.4915, 0; -3.6654; 0; -1.0513 e + 04];
Nbiter = 20;%迭代次数。
我们选择以对数尺度迭代eta的值
我们使用bvp4c求解器对相应的ODE进行积分
Eta0tab = logspace(log10(1),log10(eta0), nbiter);
为k = 1: nbiter
流(“迭代% d / % d \ n”, k,苦);
etascale = A^(1/6)
Eta = linspace(0,eta0tab(k),100);
Ginit = Finit .* etascale。^ (0:5 0) ';
solinit = bvpinit(xi,Ginit);
试一试
sol = bvp5c(@(xi, G) fun_ode(xi,G,A,Q,etascale),...
@(是的,yb) bcfun(是的,yb, Q etascale),...
solinit);
抓
%如果k==nbiter
% fprintf('最后一次迭代失败\n');
%返回
%结束
继续
结束
Finit = sol.y(:,1) ./ etascale. /^ (0:5 0) ';
结束
Eta = etascale*xi;
F = sol.y(1,:);
Fp = sol.y(2,:) / etascale;
%我们绘制结果[F;[F]在一个新的数字
图()
情节(η,- f,“- - -”,“线宽”2);
网格在
持有在
情节(η,《外交政策》,“线宽”, 2)
传奇(“F”,“F”,“位置”,“东北”)
包含(“\埃塔”,“字形大小”13);
ylabel (“(\η),F (\ eta)”,“字形大小”, 13)
我们首先构造一个1阶ODE的向量
最后一个是约束项
函数dG = fun_ode(xi,G,A,Q,etascale)
Eta = xi*etascale;
F = G ./ (etascale)。^ (0:5 0) ';
dF = [F (2:6);
(1 / (9 *)) * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3;
F (1) /);
dG = dF .* (etascale)。1 ^[1:6]”;
结束
我们用y(b)-a = 0建立该方法的残差。
函数res = bcfun(ya,yb,A,Q,etascale)
Ya = Ya ./ (etascale)。^ (0:5 0) ';
Yb = Yb ./ (etascale)。^ (0:5 0) ';
Res =[ya([2 4 6]);yb (1:3);yb (7) - q / A];
结束
布鲁诺陈德良
2022年4月15日
编辑:布鲁诺陈德良
2022年4月15日
@Wissem-Eddine KHATLA
似乎I(0)必须是0,所以I(eta0) = Q,但我不知道你在代码中哪里强加了I(0)=0。也许你应该强加的是
I()-I(0) = Q
Torsten
2022年4月15日
我不知道bvp4c是否接受这种内部雅可比矩阵的带状结构的破坏,但是是的,最后一个条件应该是
yb(7) - Q/A - ya(7)
开始应该是更好的
[-1.0513e+04;0;158.4915;0;-3.6654;0;0];
而不是
有限扩散= [-1.0513 e + 04; 0, 158.4915, 0; -3.6654; 0; -1.0513 e + 04];
我猜。
Wissem-Eddine KHATLA
2022年4月15日
@Bruno陈德良
谢谢你的评论。实际上,按照您的建议,我们可以写出a = Q = 1的无单位方程。因此,执行我的旧代码,给出如下:
似乎I(0)必须是0,所以I(eta0) = Q,但我不知道你在代码中哪里强加了I(0)=0。也许你应该强加的是
我已经考虑过了:但是我有一个六阶方程+一个积分“约束”,所以我认为7bc应该足以让求解器运行,不是吗?
需要回到黑板上仔细检查模型/参数。
我也很惊讶H积分没有n-1项(体积/质量守恒)就像一维问题一样。
我不太明白为什么积分要有(n-1)项作为整个区间的约束条件。
提前谢谢你,
Torsten
2022年4月15日
编辑:Torsten
2022年4月15日
我记得我们从积分定义域开始[-eta0,eta0]和条件
(-eta0) = F (-eta0) = F (eta0) = F (eta0) = F (0) = F”(0)= 0。
然后我们把定义域改成[0,eta0]假设解是对称的。在我看来,这只使用
' (0) = F”(0)= F”“(0)= (eta0) = F (eta0) = 0。
因为我不知道附加条件在哪里
F " (eta0) = 0
可以去掉这个条件,在系统中加入方程dF(7)/d(eta) = F(1),并加入两个边界条件
ya(7) = 0 yb(7) - Q = 0
只是个建议。
Wissem-Eddine KHATLA
2022年4月15日
@Bruno陈德良
,
@Torsten
我采用了Torsten的建议并删除了bc (F''(eta0) = 0)。
@Torsten
我添加了这个条件,因为我在寻找一个能“关闭”系统的bc:因为它意味着我在无穷远处没有曲率,我尝试了F' (eta0) = 0。
我对如何构建初始条件下的向量有疑问因为新的ODE系统是:
dF = [F (2:6);
(1 / (9 *)) * (5 * F(1) 4 *η* F (2)) 3 * F (1) ^ 2 * (2) * F (6)) / F (1) ^ 3;F (1)];
结束
如果我理解正确的话:向量的最后一个值
[1];0;0.5079;0;0.1194;0;1);bvpinit解算器的初始条件。
是对积分值的猜测,不是吗?
谢谢你!
布鲁诺陈德良
2022年4月15日
如果我理解正确的话:向量的最后一个值
[1];0;0.5079;0;0.1194;0;1);
bvpinit解算器的初始条件。
是对积分值的猜测,不是吗?”
不完全是,因为它会在张成的空间上复制,所以它是对0和积分的猜测。
Wissem-Eddine KHATLA
2022年4月16日
@Torsten
我很抱歉再次强调这一点,但我真的不明白这句话的目的:
solinit = bvpinit(eta,@(eta)guess(eta,eta0,Q));
我的意思是:这条线和这条线有什么区别??
solinit = bvpinit(eta,@guess(eta,eta0,Q));
我的理解是一样的,但是我看了相关的文档也看不出有什么区别:你能再告诉我一遍为什么要这样写吗?
再次感谢你。
布鲁诺陈德良
2022年4月16日
编辑:布鲁诺陈德良
2022年4月16日
@Wissem-Eddine KHATLA
这是不正确的匿名函数语法。
@guess(η,eta0 Q)
看起来你想写(没有@)
bvpinit(η,猜(η,eta0 Q))
这是
向量的初始化
语法。
- 函数-对于给定的网格点,guess函数必须返回一个向量,其元素是对解的相应组件的猜测。函数必须是这样的形式Y = guess(x)x是一个网格点和吗y是一个向量,其长度与解中分量的个数相同。例如,如果yinit是一个函数,那么在每个网格点bvpinit调用Y (:,j) = guess(x(j))对于多点边值问题,猜测函数必须为Y = guess(x, k)y对解的初步猜测是x在地区k.函数必须接受输入参数k,为编写guess函数提供了灵活性。但是,该功能不是必须使用的k.
我已经尝试了所有Torsen的想法,而不是不贴在这里,因为他们没有带来任何东西,不是说它降低了稳定性。
在玩了一段时间之后,我认为强迫积分是个错误的好主意。
Wissem-Eddine KHATLA
2022年4月16日
Wissem-Eddine KHATLA
2022年4月16日
@Bruno陈德良
这是因为我们没有相同的实验方法。正如你可能已经注意到的,他们构建他们的解决方案是为了“匹配”它的厚度薄膜
(这个符号不同于我之前的一个帖子,我已经注意到
我这里没有的东西
).我不确定他们的参数化在这种情况下应该如何工作
Torsten
2022年4月16日
solinit = bvpinit(eta,@(eta)guess(eta,eta0,Q));
我的意思是:这条线和这条线有什么区别??
solinit = bvpinit(eta,@guess(eta,eta0,Q));
不同之处在于,第一行可以使用bvp4c,而另一行则不行。
你试过吗?
如果您通过一个函数定义ODE解的初始猜测,则它具有以下形式
函数Finit = guess(eta)
...
结束
现在您将输入列表更改为
函数Finit = guess(eta,eta0,Q)
为了告诉MATLAB应该在输入列表的哪个位置传递eta,有必要将其表示为
@ (eta)猜(η,eta0 Q)
Torsten
2022年4月16日
这是因为我们没有相同的实验方法。正如你可能已经注意到的,他们构建他们的解决方案是为了“匹配”它的厚度薄膜(这个符号不同于我之前的一个帖子,我已经注意到):一些我没有在这里()。我不确定他们的参数化在这种情况下应该如何工作
尽管本文中潜在的物理问题可能有所不同,但我只是尝试使用MATLAB方法与bvp4c是否适用于他们的问题。这至少可以确认您目前遇到的问题是由于您的问题,而不是由于MATLAB。
Wissem-Eddine KHATLA
2022年4月16日
编辑:Wissem-Eddine KHATLA
2022年4月16日
@Torsten
我正准备这么做,但我注意到他们正在解决一个5阶方程,有4个边界条件(注意到的那个)
).而且,他们似乎有一个“隐藏”的未知参数a,他们写数值计算后其值为1.35…所以他们肯定有公元前6年,但只有4年是详细的
Wissem-Eddine KHATLA
2022年4月18日
编辑:Wissem-Eddine KHATLA
2022年4月18日
作者解决的微分问题是:
.
3边界条件容易暴露:
我想知道如何实现其他2个,因为它们是在新的参数化后推导出来的:
与
.渐近,
ϕ
验证等式:
它们有5个这种形式的指数解万博 尤文图斯
和
.它暗示了另外两个条件的推导
F
使用
ϕ
.
ϕ
是否应该验证作者认为是边界条件的两个微分方程
它们是:
我不确定如何在MATLAB上实现另一个微分方程的边界条件解。这个过程应该是一样的:
- 创建一个一阶ODE系统F.
- 在3个明显给定BC上实现边界条件和残差。
- 但是如何将另外两个解作为另一个微分方程的解呢?
提前感谢你的帮助。
布鲁诺陈德良
2022年4月18日
@Torsten
alpha是Evan论文中的放大参数。
@Wissem-Eddine KHATLA
对不起,我放弃了,我不是这方面的物理专家,对剥落、粘稠、润滑的模型没办法帮到你。
Wissem-Eddine KHATLA
2022年4月18日
编辑:Wissem-Eddine KHATLA
2022年4月18日
有5种解决方案:最明显的万博 尤文图斯是-1。两个万博 尤文图斯解的实部为正,另外两个解的实部为负(
α
和
)
Torsten
2022年4月18日
编辑:Torsten
2022年4月18日
我只能天真地评估你给出的两个表达式(我没有看文章):
(D+1)(D-)(D+ ') =
(D³+D²-abs()²*D-abs()²)=
φ”+φ”——abs(α)^ 2 *φ”——abs(α)^ 2 *φ= 0
D (D + 1) (Dα)(D +α')=
φ”“+φ”- abs(α)^ 2 *φ”——abs(α)^ 2 *φ= 0
因为F = 1 +,
“‘+ F”——abs(α)^ 2 * F”——abs(α)^ 2 * (F - 1) = 0
”“+ F”- abs(α)^ 2 * F”——abs(α)^ 2 * F = 0
因为F'' = F'''' = 0,
F' - abs(alpha)^2*F' - abs(alpha)^2*(F-1) = 0
- abs(alpha)^2*F' - abs(alpha)^2*F' = 0
因此
F' + F' = 0
F ' * (1 + abs(α)^ 2)+ abs(α)^ 2 * F - abs(α)^ 2 = 0
Wissem-Eddine KHATLA
2022年4月18日
@Torsten
谢谢你的发展:但我的问题是如何在MATLAB上实现这种条件的求解器像bvp4c ?我的意思是,这可能吗,因为这是一个暗示"混合"导数的条件?其余3个解决方案可以很容易地编码。万博 尤文图斯
Torsten
2022年4月18日
为什么是混合的?
这只是
yb yb (2) + (3)
yb (2) * (1 + abs(α)^ 2)+ abs(α)^ 2 * yb (1) abs(α)^ 2
有什么问题吗?
Wissem-Eddine KHATLA
2022年4月18日
@Torsten
好的:我认为不可能写出yb(1), yb(2)……在相同的残差关系中。谢谢:我会尽量执行,并与我们之前的尝试进行比较。
Wissem-Eddine KHATLA
2022年4月19日
编辑:Wissem-Eddine KHATLA
2022年4月19日
@Torsten
边界条件似乎如下:
- 和为
我试着为BVP求解器实现这些条件:
函数res = bc(FL,FR)
= cos(4* /5) + i*sin(4* /5);
Beta = conj(alpha);
Gamma = abs(alpha);
res = [FL(4,1);FL(5、1);...
Fr (1,1) - 1;...
FR (1, 1) fl(1、2);FR (2, 1) fl (2, 2);FR (3,1) fl (3 2);FR (4,1) fl (4,2);FR(5、1)fl (5, 2);...
(1 -(β+α))* FR(3 2) +(-(α+β)+γ^ 2)* FR (2, 2);(-(β+α)+γ^ 2)* FR (3 2) + (FR(2, 2) 1) *伽马^ 2);
结束
我只是想回顾一下我的“res”函数:我对F(0) = 1的条件有点不安。你认为我写的对吗?我在文档中看到有一个“区域”功能,但我不确定如何在这种情况下实现。
先谢谢你
@Torsten
Wissem-Eddine KHATLA
2022年4月20日
编辑:Wissem-Eddine KHATLA
2022年4月20日
代码如下:
Eta0 = 20;
Etamesh = [linspace(-eta0,0,100),linspace(0,eta0,100)];
Finit = [1;0.5;1;0;0);
solinit = bvpinit(etamesh,Finit)
Sol = bvp5c(@fun_ode, @bc, solinit);
图()
情节(sol.x sol.y (1:)“线宽”, 1.5)%绘图F
ylim (2 [2]);
持有在
情节(sol.x sol.y (3:)“线宽”, 1.5)%绘图F”
情节(sol.x sol.y (5:)“线宽”, 1.5)%绘图F''''
网格在
传奇(“F”,“F”“,“F”“”,“位置”,“西北”)
函数dfdelta = fun_ode(eta,F,region)
dFdeta = [F (2), (3); F (4), F(5),(行进(1))/ F (1) ^ 3];
结束
%边界条件:
% F " '(-eta0) = F''''(-eta0) = 0
% f (0) = 1
% [1] = [2] = 0 on eta = eta0
函数res = bc(FL,FR)
= cos(4* /5) + i*sin(4* /5);
Beta = conj(alpha);
Gamma = abs(alpha);
res = [FL(4,1);FL(5、1);...
Fr (1,1) - 1;...
FR (1, 1) fl(1、2);FR (2, 1) fl (2, 2);FR (3,1) fl (3 2);FR (4,1) fl (4,2);FR(5、1)fl (5, 2);...
(1 -(β+α))* FR(3 2) +(-(α+β)+γ^ 2)* FR (2, 2);(-(β+α)+γ^ 2)* FR (3 2) + (FR(2, 2) 1) *伽马^ 2);
结束
我认为我的代码一切正常:也许你会发现一个错误?
谢谢你!
Torsten
2022年4月20日
看起来对我来说不错(就内容而言,我不能在这里发表意见)。
你这话是什么意思
不幸的是,我的代码不工作,因为我应该找到F " (-eta0) = 1.35…
你的代码不工作或不能提取F " (-eta0)或F " (-eta0)不等于1.35…?
发生错误
由于对页面进行了更改,无法完成操作。重新加载页面以查看其更新状态。
你亦可选择下列网址:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家网站没有针对您所在位置的访问进行优化。