将一阶导数代入含高阶导数表达式的替换问题求助
解决Maxima中一阶导数代入高阶导数表达式的问题
问题原因
subst函数只能替换完全匹配的表达式。你定义的O0sol是diff(P0,T0)=w0,只有diff(P0,T0)会被替换为w0,而二阶导数diff(P0,T0,2)、混合导数diff(diff(P0,T0),T1)等和一阶导数不是同一个表达式,因此无法直接被替换。但根据数学规则,常数的导数为0,所以这些高阶导数都应该等于0,需要让Maxima识别这个推导关系。
解决方案
方法1:使用gradef定义导数规则
gradef是Maxima中专门用于定义函数导数的命令,直接指定P0对T0的一阶导数为常数w0,后续求高阶导数时会自动计算常数的导数为0:
declare([w0], constant); depends(P0, [T0, T1]); gradef(P0, T0, w0); /* 定义P0对T0的一阶导数为w0 */ ex1: diff(P0, T0); /* 输出:w0 */ ex2: diff(P0, T0, 2); /* 输出:0 */ ex3: diff(diff(P0,T0),T1); /* 输出:0 */ ex4: diff(diff(P0,T1),T0); /* 输出:0(混合导数等价于diff(diff(P0,T0),T1)) */
方法2:使用tellrat建立替换规则
tellrat可以处理包含导数的有理表达式替换,定义一阶导数的等式后,高阶导数会自动根据导数规则推导:
declare([w0], constant); depends(P0, [T0, T1]); tellrat(diff(P0, T0) = w0); ex1: diff(P0, T0); /* 输出:w0 */ ex2: diff(P0, T0, 2); /* 输出:0 */ ex3: diff(diff(P0,T0),T1); /* 输出:0 */ ex4: diff(diff(P0,T1),T0); /* 输出:0 */
方法3:手动展开高阶导数后替换
将高阶导数展开为一阶导数的导数,再替换一阶导数为常数,最后利用常数导数为0的规则计算:
declare([w0], constant); depends(P0, [T0, T1]); O0sol:[diff(P0,T0)=w0]; ex1: subst(O0sol, diff(P0,T0)); /* 输出:w0 */ ex2: subst(O0sol, diff(diff(P0,T0), T0)); /* 先展开二阶导数为一阶导数的导数,替换后得到diff(w0, T0)=0 */ ex3: subst(O0sol, diff(diff(P0,T0), T1)); /* 替换后得到diff(w0, T1)=0 */ ex4: subst(O0sol, diff(diff(P0,T0), T1)); /* 混合导数交换顺序后等价于上式,输出0 */
内容的提问来源于stack exchange,提问作者Nidish Narayanaa
相关产品推荐
相关产品推荐

