使用Maxima的solve()求解幂函数双变量遇空结果,求解决方法
解决Maxima中
solve()求解幂函数参数返回空结果的问题 问题背景
我想用Maxima的solve()函数求解幂函数 f(x) = b * x^a 的参数a和b,已知函数图像经过点(8, 6)和(18, 2)。按照文档示例在wxMaxima中输入:
%i1 solve ([b*8^a=6,b*18^a=2], [a,b]); %o1 []
返回空结果。我知道可以通过手动推导公式计算参数(代码如下),但步骤繁琐,想知道是不是遗漏了solve()的相关设置?
手动计算代码:
findA: a=(log(y_2/y_1)/log(x_2/x_1)); findB: b = y_1/x_1^a; [x_1=8,y_1=6,x_2=18,y_2=2]; subst (%, findA), numer; a=-1.354755645675727 subst ([x_1=8,y_1=6,x_2=18,y_2=2,a=-1.354755645675727], findB), numer; b=100.37313960722
问题原因
Maxima默认的solve()函数仅支持解析求解代数方程(如多项式方程),而你的方程组包含指数位置的未知数a,属于超越方程,默认solve()无法处理这类方程,因此返回空列表。
解决方法
1. 加载to_poly_solve扩展包
to_poly_solve是Maxima的扩展包,支持求解包含指数、对数的超越方程。加载后solve()即可返回解析解,再通过numer转为数值结果:
%i1 load(to_poly_solve); %i2 solve ([b*8^a=6,b*18^a=2], [a,b]); %o2 [[a = log(1/3)/log(9/4), b = 6*8^(-log(1/3)/log(9/4))]] %i3 solve ([b*8^a=6,b*18^a=2], [a,b]), numer; %o3 [[a = -1.354755645675727, b = 100.3731396072202]]
2. 手动消元化简后求解
先通过方程相除消去b,得到仅含a的方程,再单独求解:
%i1 eq1: b*8^a = 6; %i2 eq2: b*18^a = 2; %i3 eq3: eq1 / eq2; /* 得到 (8/18)^a = 3 */ %o3 (4/9)^a = 3 %i4 solve(eq3, a); %o4 [a = log(3)/log(4/9)] %i5 a_val: rhs(first(%)); %i6 b_val: rhs(first(solve(subst(a=a_val, eq1), b))); %i7 [a_val, b_val], numer; %o7 [-1.354755645675727, 100.3731396072202]
3. 直接用find_root求数值解
如果只需要数值结果,可直接用find_root指定a的取值范围求解:
%i1 eq_a: (8/18)^a = 6/2; %i2 a_num: find_root(eq_a, a, -2, 0); %o2 -1.354755645675727 %i3 b_num: 6 / (8^a_num); %o3 100.3731396072202
内容的提问来源于stack exchange,提问作者dotnetCarpenter
相关产品推荐
相关产品推荐

