2
$\begingroup$

Below is an economic equation consisting of Y, Ki, Alpha, G, Ki, K, and two parameters Epsilon and Eta. Mathematica's Solve method computes G, in terms of the other variables, but fails to solve for Ki, as shown below. I have included an 'Assuming block' to help push a solution for Ki, yet this addition does not guide the solution.

What makes Ki difficult in solve to this case?

A call to the Solve method for G works with a warning:

Solve[Y == α Ki ((G (Ki/K)^(1 - ϵ))/Ki)^η, G]

Solve::ifun: Inverse functions are being used by Solve, so some solutions may not be found; use Reduce for complete solution information.

Here is an acceptable solution for G:

{{G->K (Ki/K)^ϵ (Y/(α Ki))^(1/η)}}

A similiar call for Ki fails. What makes Ki uniquely difficult in this case?

Assuming[{{Y, Ki, G, K, α , ϵ, η} ∈ 
Reals, 1 >= η >= 0, 1 >= ϵ >= 0, K > 0, Y > 0, 
Ki > 0, G > 0, α > 0},
Simplify[
Solve[Y = α Ki ((G (Ki/K)^(1 - ϵ))/Ki)^η, Ki]]]

Solve::nsmet: This system cannot be solved with the methods available to Solve.

$\endgroup$
  • 3
    $\begingroup$ Note: K is a symbol with a predefined meaning. It is better not to use it as a symbolic variable (more generically, try to refrain from using upper case variables; use y,g,ki instead of Y,G,Ki). Note also that equations use == instead of =. $\endgroup$ – AccidentalFourierTransform May 12 '19 at 16:20
4
$\begingroup$

Solve is awesome if the expressions involve rational functions. Otherwise it may need a little assistance.

Solve[Y == α Ki ((G (Ki/K)^(1 - ϵ))/Ki)^η // PowerExpand, Ki]
| improve this answer | |
$\endgroup$
3
$\begingroup$

Including a switch of '//PowerExpand' led to an answer.

Changing the variable names to lower case maybe valuable, yet I did not test this suggestion.

Solve[Y == α Ki ((G (Ki/K)^(1 - ϵ))/Ki)^η // PowerExpand, Ki]
{{Ki->((Y G^-η K^(η (1-ϵ)))/α)^(1/(1-η ϵ))}}
Solve[Y == α Ki ((G (Ki/K)^(1 - ϵ))/Ki)^η // PowerExpand, K]
{{K->((Y G^-η Ki^(η+η (-(1-ϵ))-1))/α)^(1/(η (ϵ-1)))}}
| improve this answer | |
$\endgroup$
0
$\begingroup$

From PowerExpand section possible issues:

enter image description here

This implies that the equation in this generality should not be solved despite there is a result!

Assuming[{{Ys, Ki, Gs, Ks, \[Alpha], \[Epsilon], \[Eta]} \[Element] 
   Reals, 1 >= \[Eta] >= 0, 1 >= \[Epsilon] >= 0, Ks > 0, Y > 0, 
  Ki > 0, Gs > 0, \[Alpha] > 0}, 
 Solve[Ys == 
   PowerExpand[\[Alpha] Ki ((Gs (Ki/Ks)^(1 - \[Epsilon]))/Ki)^\[Eta]],
   Ki]]

message

{{Ki -> ((Ks^((1 - \[Epsilon])*\[Eta])*Ys)/(Gs^\[Eta]*\[Alpha]))^(1/(1 - \[Epsilon]*\[Eta]))}}

Reduce does not produce an answer even with PowerExpand.

Assuming[{Element[{Ys, Ki, Gs, Ks, \[Alpha], \[Epsilon], \[Eta]}, 
   Reals], 1 >= \[Eta] >= 0, 1 >= \[Epsilon] >= 0, 
     Ks > 0, Y > 0, Ki > 0, Gs > 0, \[Alpha] > 0}, 
   Solve[Ys == 
   PowerExpand[\[Alpha]*
     Ki*((Gs*(Ki/Ks)^(1 - \[Epsilon]))/Ki)^\[Eta]], Ks]]

message

{{Ks -> ((Ki^(-1 + \[Eta] - (1 - \[Epsilon])*\[Eta])*Ys)/(Gs^\[Eta]*\[Alpha]))^(1/((-1 + \[Epsilon])*\[Eta]))}}

So Automatic->True is not very reliable. And using this advice leds to the concept to put the Assuming conditions into the Assumption options of PowerExpand.

PowerExpand[\[Alpha] Ki ((Gs (Ki/Ks)^(1 - \[Epsilon]))/Ki)^\[Eta], 
 Assumptions -> 1 >= \[Eta] >= 0]

E^(-2*I*Pi*\[Eta]*Floor[1/2 - Arg[Ki]/(2*Pi) + Arg[Ks]/(2*Pi)] + 
    2*I*Pi*(1 - \[Epsilon])*\[Eta]*Floor[1/2 - Arg[Ki]/(2*Pi) + Arg[Ks]/(2*Pi)] + 
    2*I*Pi*\[Eta]*Floor[1/2 - Arg[Gs]/(2*Pi) + Arg[Ki]/(2*Pi) - Im[(1 - \[Epsilon])*Log[Ki]]/
        (2*Pi) - Im[(-1 + \[Epsilon])*Log[Ks]]/(2*Pi) + 
       Floor[1/2 - Arg[Ki]/(2*Pi) + Arg[Ks]/(2*Pi)]*Re[\[Epsilon]]])*Gs^\[Eta]*
  Ki^(1 - \[Eta] + (1 - \[Epsilon])*\[Eta])*Ks^((-1 + \[Epsilon])*\[Eta])*\[Alpha]

From Assuming Assuming affects functions using the Assumptions :> $Assumptions option setting: This is an expression that Solve can not deal with and cope with.

Quiet[Select[ToExpression /@ Names["System`*"], 
  Head[#] === Symbol && 
    MemberQ[Options[#], Assumptions :> $Assumptions] &]]

{ArcLength, Area, ContinuedFractionK, Convolve, DEigensystem,
DEigenvalues, DifferenceDelta, DifferenceQuotient,
DifferenceRootReduce, DifferentialRootReduce, DirichletTransform,
DiscreteConvolve, DiscreteLimit, DiscreteMaxLimit, DiscreteMinLimit,
DiscreteRatio, DiscreteShift, DSolve, DSolveValue, Expectation,
ExpectedValue, ExponentialGeneratingFunction, FinancialBond,
FourierCoefficient, FourierCosCoefficient, FourierCosSeries,
FourierCosTransform, FourierSequenceTransform, FourierSeries,
FourierSinCoefficient, FourierSinSeries, FourierSinTransform,
FourierTransform, FourierTrigSeries, FullSimplify, FunctionExpand,
GeneratingFunction, GraphPropertyDistribution, GreenFunction,
HankelTransform, Integrate, InverseFourierCosTransform,
InverseFourierSequenceTransform, InverseFourierSinTransform,
InverseFourierTransform, InverseHankelTransform,
InverseMellinTransform, InverseRadonTransform, InverseZTransform,
ItoProcess, LaplaceTransform, Limit, MaxLimit, MeijerGReduce,
MellinConvolve, MellinTransform, MinLimit, MomentOfInertia,
Perimeter, PiecewiseExpand, PossibleZeroQ, Probability, Product,
RadonTransform, Refine, RegionCentroid, RegionDimension,
RegionDisjoint, RegionEqual, RegionMeasure, RegionMoment,
RegionWithin, Residue, Series, SeriesCoefficient, Simplify,
StratonovichProcess, Sum, SumConvergence, TensorDimensions,
TensorExpand, TensorRank, TensorReduce, TensorSymmetry, TimeValue,
TransformedProcess, Volume, ZTransform}

So not Solve and not Reduce. And not Arg.

The deal comes with Assumptions section Properties & Relation:

Assuming[{Element[{Ys, Ki, Gs, Ks, \[Alpha], \[Epsilon], \[Eta]}, 
   Reals], 1 >= \[Eta] >= 0, 1 >= \[Epsilon] >= 0, 
     Ks > 0, Y > 0, Ki > 0, Gs > 0, \[Alpha] > 0}, {$Assumptions, 
  Refine[-2*I*Pi*\[Eta]*Floor[1/2 - Arg[Ki]/(2*Pi) + Arg[Ks]/(2*Pi)] + 
        2*I*Pi*(1 - \[Epsilon])*\[Eta]*
     Floor[1/2 - Arg[Ki]/(2*Pi) + Arg[Ks]/(2*Pi)] + 
        2*I*Pi*\[Eta]*
     Floor[1/2 - Arg[Gs]/(2*Pi) + Arg[Ki]/(2*Pi) - 
       Im[(1 - \[Epsilon])*Log[Ki]]/
                (2*Pi) - Im[(-1 + \[Epsilon])*Log[Ks]]/(2*Pi) + 
              
       Floor[1/2 - Arg[Ki]/(2*Pi) + Arg[Ks]/(2*Pi)]*Re[\[Epsilon]]]]}]

{(Ys | Ki | Gs | Ks | \[Alpha] | \[Epsilon] | \[Eta]) \[Element] 
   Reals && 1 >= \[Eta] >= 0 && 1 >= \[Epsilon] >= 0 && Ks > 0 && 
  Y > 0 && Ki > 0 && Gs > 0 && \[Alpha] > 0, 0}

Assuming[{{Ys, Ki, Gs, Ks, \[Alpha], \[Epsilon], \[Eta]} \[Element] 
   Reals, 1 >= \[Eta] >= 0, 1 >= \[Epsilon] >= 0, Ks > 0, Y > 0, 
  Ki > 0, Gs > 0, \[Alpha] > 0}, {$Assumptions, 
  Solve[Ys == 
    Refine[PowerExpand[
      Refine[\[Alpha] Ki ((Gs (Ki/Ks)^(1 - \[Epsilon]))/Ki)^\[Eta]], 
      Assumptions -> 1 >= \[Eta] >= 0]], Ki]}]

{Element[Ys | Ki | Gs | Ks | \[Alpha] | \[Epsilon] | \[Eta], Reals] && 1 >= \[Eta] >= 0 && 1 >= \[Epsilon] >= 0 && 
   Ks > 0 && Y > 0 && Ki > 0 && Gs > 0 && \[Alpha] > 0, 
  {{Ki -> ((Ks^((1 - \[Epsilon])*\[Eta])*Ys)/(Gs^\[Eta]*\[Alpha]))^(1/(1 - \[Epsilon]*\[Eta]))}}}

So that is better practice with Mathematica!

Assuming[{{Ys, Ki, Gs, Ks, \[Alpha], \[Epsilon], \[Eta]} \[Element] 
   Reals, 1 >= \[Eta] >= 0, 1 >= \[Epsilon] >= 0, Ks > 0, Y > 0, 
  Ki > 0, Gs > 0, \[Alpha] > 0}, {$Assumptions, 
  Solve[Ys == 
    Refine[PowerExpand[
      Refine[\[Alpha] Ki ((Gs (Ki/Ks)^(1 - \[Epsilon]))/Ki)^\[Eta]], 
      Assumptions -> 1 >= \[Eta] >= 0]], Ks]}]

{Element[Ys | Ki | Gs | Ks | \[Alpha] | \[Epsilon] | \[Eta], Reals] && 1 >= \[Eta] >= 0 && 1 >= \[Epsilon] >= 0 && 
   Ks > 0 && Y > 0 && Ki > 0 && Gs > 0 && \[Alpha] > 0, 
  {{Ks -> ((Ki^(-1 + \[Eta] - (1 - \[Epsilon])*\[Eta])*Ys)/(Gs^\[Eta]*\[Alpha]))^(1/((-1 + \[Epsilon])*\[Eta]))}}}

So the question was: "A similar call for Ki fails. What makes Ki uniquely difficult in this case?"

Nothing on the behalf of Mathematica or Wolfram Language. You just did not know how to operate with Assumption even not from the documentation page of Mathematica. But now I tought You, how to us Assumption for this problem and Your path for a more advanced user of Mathematica did a step ahead. I introduced to You the built-in Refine and how it operates in Solve.

You know now two facts:

(a) Solve respects Your assumptions if Your input does program that.

(b) The already known solution is the correct one. There is no other one with Solve and the output shows this clearly.

That does not mean that the special cases have to be treated by setting them before the use of Solve. This is a valid solution that may differ from the solution is special cases. I used the tips from @AccidentialFourierTransform.

Have fun and experiment with this newly acquired knowledge.

| improve this answer | |
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.