使用符号数学工具箱获取准确的衍生品
7视图(30天)
显示旧的评论
嗨,所有
我编码模型,需要广泛的偏微分法(第一、二阶导数)。我决定尝试使用符号数学工具箱的偏导数。我用以下方法:
1)使用diff()函数来确定衍生品
2)使用潜艇()的值来确定在某一点的导数
3)使用双()符号值转换为数值,可用于后续计算
为了验证舍入错误或内部取消不减少我的衍生品的准确性与步骤1得到3,我检查结果对数字衍生品(公式数值第一和第二偏导数w.r.t. x和y提供
https://en.wikipedia.org/wiki/Finite_difference
在标题“多元有限的差异”。h = k = 0.00001)。
我发现%区别的一些“分析”衍生品获得使用符号数学工具箱(步骤1 - 3)和检查(数字衍生品)有时不满意(高达0.0076%,比如果这种差异至少2数量级较小)。
如何增加数值之间的协议和“分析”衍生品?
我已经尝试使用数字(300)增加使用的精密计算。我也使用vpa(…, 300),以防止在分化截断误差。
它是徒劳的试图让数值和匹配的“分析”衍生品在更大程度上?
提前谢谢。
亚历克斯
0评论
接受的答案
Andreas Apostolatos
2021年3月30日
你好,
符号表达式的评价代表分析衍生品在MATLAB只能由舍入错误可能发生在评估。vpa的功能可以为您提供更高精度的舍入错误相应的评估。因此,只有舍入错误扮演一个角色在评估MATLAB的符号表达式。
相反,当计算导数数值,例如,使用有限差分法,那么解决方案精度主要取决于离散化参数,在你的情况中“h”和“k”,和这些结果原则上应该减少到一个更好的近似相应的导数。当然,进入舍入错误在这种情况下,和这两个(离散化和舍入误差)是更重要的完全取决于水平的两个错误。
已经说过,我希望,你可以得到一个更好的协议分析和离散表达式之间的超过0.0076%的导数,如果你想减少步骤大小“h”和“k”,如果你衍生品的价值并不高,舍入误差在0.0076%的水平都是很重要的。然而,肯定会有一个时候大小减少一步,舍入误差的计算比离散误差,但我希望这发生在一个错误水平远低于0.0076%,前提是导数的实际价值不是很高。
我希望这有助于理解。
亲切的问候,
安德烈亚斯
11日评论
亚历山大Schulze-Hulbe
2021年3月30日
你好安德烈亚斯
非常感谢你的帮助回答。像你说的,我“h”和“k”减少,这样h = k = 1 e-6。而他产生更好的结果,但是h = k = 1 e %误差增加。这表明舍入错误比错误更重要这个值的离散化引入的“h”/“k”。
你让我意识到,这个问题很可能在于数字衍生品——也许比较符号数学工具箱结果与他们不是最好的方法来验证我的模型是准确的。
我也意识到,这两个数值的输出以及获得的象征性的衍生品与上面讨论的步骤1 - 3有时非理性的部分。你或许可以解释为什么这是(我应该问这个在一个单独的post) ?
亲切的问候
亚历克斯
Andreas Apostolatos
2021年3月30日
你好,亚历克斯,
我很高兴帮助和理解!
请记住,减少帧中的步长有限差分法将最终的解决方案由舍入误差,有关更多信息,请参见以下链接,
事实上,下面的步长有一个阈值的近似导数会恶化。因此,一个可能的最优步长,它提供了最好的导数的近似。有不同的有限差分公式,你可以尝试,每一个都有自己的好处和缺点。
我认为比较数值近似获得通过有限差分方法对获得的解析解对符号数学工具箱是富有成效的。分析解决方案可以安全地假定作为参考的解决方案。有限差分格式的问题提供了一种收敛近似参考解决方案一定程度的步长,如上所述。
你提到有时你获得解决方案中不合理的部分从分析推导通过符号数学工具箱和数值解。你的意思我认为非理性部分“sqrt(2)”等数字。我不立即看到任何限制在分析这些价值一般函数的导数。关于数值表达式,它可能是符号数学工具箱简化了底层表达导致各个部分包括不合理的部分。因此,我不排除这种可能性。
我希望这可以帮助!
亲切的问候,
安德烈亚斯
亚历山大Schulze-Hulbe
2021年3月31日
你好安德烈亚斯
非常感谢你——这也是很有帮助的!
道歉——我想说的虚部在解决方案在我之前的评论,不是不合理的,为什么MATLAB有时给我答案与零虚构的组件(例如5 + 0.1 *我)数值和解析衍生品吗?
亲切的问候
亚历克斯
Andreas Apostolatos
2021年3月31日
嗨,亚历克斯,
谢谢你的澄清。似乎一些MATLAB函数可能导致复杂的表情而被分化由于自动简化通过标准规则,看到下面的MATLAB回答相应的线程,
这也提出了一个解决方案为特定的情况下,在一个表达式的平方根是转化为一个表达式包含一个绝对值的标准三角转换规则。因此,以防你的表达式简化通向一个表达式包含虚部,你可以执行你的表情不使用另一种简化的命令“重写”。相应的更多信息,请访问下面的文档页面,
另一个可能的解决方案是将符号变量的假设之上。如果例如“x”声明为一个符号变量,即
信谊x
然后,您可以声明变量“x”是真实的,通过下面的命令,
假设(x,“真实”的)
有关更多信息,请访问下面的文档页面,
我希望这些信息使得事情有些清晰。
亲切的问候,
安德烈亚斯
亚历山大Schulze-Hulbe
2021年4月1日
编辑:亚历山大Schulze-Hulbe
2021年4月1日
你好安德烈亚斯,
非常感谢。这是非常有益的!一般来说,似乎象征性的表达往往是复杂的(即观点返回0)。我使用的模型与虚值没有物理意义,这就是为什么我需要确保一切是真实的。
不幸的是,“假设”似乎并不奏效。例如,请参见下图:
信谊m1 x epsilon1 n1真实
EoS = (m1 x epsilon1 n1);
信谊T d
假设(d,“真实”的)
伊斯雷尔(d)%返回true
d = EoS (2) * (1 - 0.12 . * exp (3。* (EoS (3)) * (1. / T)));%定义d。
伊斯雷尔(d)%返回false
在上面的示例中,有什么方法可以避免d变得复杂?
亲切的问候
亚历克斯
Andreas Apostolatos
2021年4月6日
嗨,亚历克斯,
非常感谢分享这个代码片段。
这里发生了什么如下:变量' d '声明为真实的,但它是分配给一个表达式不一定是真实的。所以你获得一个复杂的结果在执行,
d = EoS (2) * (1 - 0.12 . * exp (3。* (EoS (3)) * (1. / T)));%定义d。
函数的假设使假设中所使用的变量时,右边的一个表达式。如果您将该变量分配给另一个表达式(通过将右手边的一个等式左边),那么假设不再适用。
为了达到理想的结果,请将后者表达式中使用的变量声明为“真实”的,也就是说,
信谊m1 x epsilon1 n1真实
假设(x,“真实”的)%声明变量“x”是真实的,因为它用于以下表达式
EoS = (m1 x epsilon1 n1);
信谊T d
假设(T)“真实”的)%声明变量“T”真正的因为它是用于以下表达式
假设(d,“真实”的)
伊斯雷尔(d)%返回true
d = EoS (2) * (1 - 0.12 . * exp (3。* (EoS (3)) * (1. / T)));%定义d。
伊斯雷尔(d)%返回true
既然变量“x”(或者说“EoS(2)”)和“T”声明为“真实”的,你分配给变量的表达式' d '是真实的。
我希望这些信息可以帮助你进一步!
亲切的问候,
安德烈亚斯
亚历山大Schulze-Hulbe
2021年4月6日
你好安德烈亚斯,
非常感谢!你让我意识到一个错误:我忘了变量“T”定义为真实的。
我意识到我把复杂的输出,因为日志和sqrt函数给复杂的输出符号变量,即使这些符号变量被定义为真实的。例如:
信谊x y z真正的
日志(y = x)
伊斯雷尔(y)%返回false
z =√x)
伊斯雷尔(z)%返回false
是否有办法让y和z真实的吗?
提前感谢你的时间。
亲切的问候
亚历克斯
Andreas Apostolatos
2021年4月7日
嗨,亚历克斯,
假设“x”是有表情的真实是不够的
日志(x)
”和“
sqrt (x)
“是真实的。
事实上,你需要变量“x”是绝对积极的,以确保表达的
日志(x)
”和“
sqrt (x)
是实数。下面的代码片段应该实现你在寻找什么,
> >符号xy z
假设(x,“积极”)
日志(y = x)
伊斯雷尔(y)%这返回true
z =√x)
伊斯雷尔(z)%现在也返回true
我希望这可以帮助。
亲切的问候,
安德烈亚斯
亚历山大Schulze-Hulbe
2021年4月8日
编辑:亚历山大Schulze-Hulbe
2021年4月8日
你好安德烈亚斯
哦,是的,当然!这是有帮助的,谢谢。
麻烦给我是什么是一个表达式的“日志(1 - x)”- I can't seem to convince MATLAB that "1-x" should be a positive value. If I'm not mistaken, MATLAB accepts that "1-x" is real, just not that it's positive.
请见我下面的代码片段。
清晰的所有%清除所有符号变量
信谊m1 d_sigma epsilon1 n1 N_av T d V
d = d_sigma * (1 - 0.12 * exp (3 * (epsilon1) * (1 / T)));
假设(m1,“真实”的)
假设(d_sigma“真实”的)
假设(epsilon1“真实”的)
假设(n1,“真实”的)
假设(N_av“真实”的)
假设(T)“真实”的)
assumeAlso (d,“真实”的)
假设(V,“真实”的)
%这段中定义的值都有物理意义
%,不应该消极。
assumeAlso (m1,“积极”)
assumeAlso (d_sigma“积极”)
assumeAlso (epsilon1“积极”)
assumeAlso (n1,“积极”)
assumeAlso (N_av“积极”)
assumeAlso (T)“积极”)
assumeAlso (d,“积极”)
assumeAlso (V,“积极”)
A1 =π* N_av / (6 * V) * n1 * m1 * (d) ^ 3
B1 =日志(A1)
test1 =伊斯雷尔(B1)%返回true,但我真正感兴趣的日志(1 a1)
B2 =日志(1 a1)
test2 =伊斯雷尔(B2)%返回false -我认为这是因为(1 a2)可能是负的,
%这意味着复数计算时不能排除日志(1 a1)
assumeAlso (A1 < 1)%使用这个来防止可能的自然对数的一个负数
B3 =日志(1 a1)
test3 =伊斯雷尔(B3)%仍然返回false,为什么?
提前感谢你的时间。
亲切的问候
亚历克斯
注:看到这个帖子的标题可能有点误导(最初本是关于衍生品),我要转发这最后一个问题分开。
Andreas Apostolatos
2021年4月8日
你好,亚历克斯,
的确是更好这个问题发布在一个单独的线程来解决每个问题在适当的频道为了清晰。
因为你要转发这个问题,请提供一个链接到新职位所为了完整性。
谢谢。
亲切的问候,
安德烈亚斯
亚历山大Schulze-Hulbe
2021年4月8日
你好安德烈亚斯
这是链接。
//www.tianjin-qmedu.com/matlabcentral/answers/796617-symbolic-math-toolbox-obtaining-real-values-from-an-expression-of-the-form-log-1-x?s_tid=srchtitle
亲切的问候亚历克斯
更多的答案(0)
一个错误发生
无法完成的行动,因为页面所做的更改。重新加载页面更新状态。
你也可以从下面的列表中选择一个网站
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。