【求助mathematica解方程组的问题】

[复制链接]
查看11 | 回复3 | 2021-1-29 04:33:32 | 显示全部楼层 |阅读模式
想用mathematica解析解决方程组,但是出现了错误,很不解。请版上的朋友帮忙看看。谢谢!
f1[x_]:=Exp[I*k*x]+a*Exp[-I*k*x];f2[x_]:=b*Exp[I*k*x]+c*Exp[-I*k*x];f3[x_]:=d*Exp[I*k*x];g1[x_]:=D[f1[x],x];g2[x_]:=D[f2[x],x];g3[x_]:=D[f3[x],x];$Assumptions=l0;Solve[f1[(-l)]==f2[(-l)],f2[l]==f3[l],g2[(-l)]-g1[(-l)]==2*m*V/\[HBar]^2*f1[(-l)],g3[l]-g2[l]==2*m*V/\[HBar]^2*f2[l],{a,b,c,d}]
提示错误:General::ivar:-lisnotavalidvariable.
我死活不知道这错误是怎么回事,请大家帮忙看看啊。最好能调对给我说说到底怎么回事。

回复

使用道具 举报

千问 | 2021-1-29 04:33:32 | 显示全部楼层
主要问题是,你应该把:=换成=。次要问题是,你的Solve命令里面的方程组,要用{}括起来。
注意:通常在定义函数时,能用=就用=,除非你确知为什么要用:=的时候,再用符号:=定义。定义表达式也是这样。
------------------------------------
下面是解释:
在Mathematica中,赋值就是=,而:=是延迟赋值。如果你熟悉C,那么一个粗略的对比就是,前者是一般的赋值或函数定义,后者是宏定义。准确地说,对于前者,=右边的东西在定义时求值,对于后者,:=右边的东西在使用时求值。
这里你的问题是什么呢?你使用g1[x_]:=D[f1[x],x];来定义g1是f1的导函数。但因为用的是:=,所以这个定义在实际代入参数时才有效果。也就是说,当你写(我还是用比较清楚的字母t吧)g1[-t]的时候,就相当于写D[f1[-t],-t]也就是对f1[-t]做导数,微分变量是-t。那么很显然,Mathematica就会报错,因为-t并不是一个合法的微分变量,它是一个表达式。
而如果你使用=来定义函数,那就不一样了。因为我们在定义g1[x_]=D[f1[x],x];时,就立即对这个导数求值了。此时的结果就是正确的,因为对上式右边求值时,微分变量是x,得到的g1已经是一个合法的导函数。
freaky (freaky) 在 ta 的帖子中提到:想用mathematica解析解决方程组,但是出现了错误,很不解。请版上的朋友帮忙看看。谢谢!f1[x_]:=Exp[I*k*x]+a*Exp[-I*k*x];f2[x_]:=b*Exp[I*k*x]+c*Exp[-I*k*x];f3[x_]:=d*Exp[I*k*x];g1[x_]:=D[f1[x],x];g2[x_]:=D[f2[x],x];g3[x_]:=D[f3[x],x];$Assumptions=l0;Solve[f1[(-l)]==f2[(-l)],...........................

回复

使用道具 举报

千问 | 2021-1-29 04:33:32 | 显示全部楼层
正确的写法:f1[x_]=Exp[I*k*x]+a*Exp[-I*k*x];f2[x_]=b*Exp[I*k*x]+c*Exp[-I*k*x];f3[x_]=d*Exp[I*k*x];g1[x_]=D[f1[x],x];g2[x_]=D[f2[x],x];g3[x_]=D[f3[x],x];$Assumptions=l0;Solve[{f1[(-l)]==f2[(-l)],f2[l]==f3[l],g2[(-l)]-g1[(-l)]==2*m*V/\[HBar]^2*f1[(-l)],g3[l]-g2[l]==2*m*V/\[HBar]^2*f2[l]},{a,b,c,d}]
freaky (freaky) 在 ta 的帖子中提到:想用mathematica解析解决方程组,但是出现了错误,很不解。请版上的朋友帮忙看看。谢谢!f1[x_]:=Exp[I*k*x]+a*Exp[-I*k*x];f2[x_]:=b*Exp[I*k*x]+c*Exp[-I*k*x];f3[x_]:=d*Exp[I*k*x];g1[x_]:=D[f1[x],x];g2[x_]:=D[f2[x],x];g3[x_]:=D[f3[x],x];$Assumptions=l0;Solve[f1[(-l)]==f2[(-l)],...........................

回复

使用道具 举报

千问 | 2021-1-29 04:33:32 | 显示全部楼层
跟Makefile恰好完全相反,真是令人动容--
cauchy (可贺) 在 ta 的帖子中提到:主要问题是,你应该把:=换成=。次要问题是,你的Solve命令里面的方程组,要用{}括起来。注意:通常在定义函数时,能用=就用=,除非你确知为什么要用:=的时候,再用符号:=定义。定义表达式也是这样。------------------------------------下面是解释:在Mathematica中,赋值就是=,而:=是延迟赋值。如果你熟悉C,那么一个粗略的对比就是,前者是一般的赋值或函数定义,后者是宏定义。准确地说,对于前者,=右边的东西在定义时求值,对于后者,:=右边的东西在使用时求值。这里你的问题是什么呢?你使用...........................
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行