Finding Solution to Inequality in Matlab
Show older comments
I have a system of five equations. As below
syms x y z v w q beta rho theta lambda b tau
eqn1 = x == q*(2*rho/(1-lambda) + beta*y) + (1-q)*((1-theta)*(1-tau)/(1-lambda)+beta*z);
eqn2 = y == q*beta*v + (1-q)*(b*(1-theta)/(1-lambda)+beta*z);
eqn3 = v == q*(2*rho/(1-lambda)+ beta*y) + (1-q)*(b*(1-theta)/(1-lambda)+beta*z);
eqn4 = z == (x + w)/2;
eqn5 = w == q*beta*y + (1-q)*((1-tau)*(1-theta)\(1-lambda)+ beta*z);
I want to find the solution for x, in terms of q, beta, rho, theta, lambda, b and tau.
sol = solve([eqn1, eqn2, eqn3, eqn4, eqn5], [x, y, z, w, v]);
sol.x
After that, I want to find the solution to the following inequality
eqn6 = (1-tau)*(1-theta)/((1-beta)*(1-lambda))> sol.x;
This is where the problem begins. When I run the following command:
solution = solve (eqn6, theta);
I get the following error message:
Warning: Unable to find explicit solution. For options, see help. > In sym/solve (line 317)
In dynamic_model_8 (line 13)
I get that these equations are complex, but is there a way to get matlaf to find the result?
Thanks in advance.
Answers (3)
I don't understand the result, but there is some output from the symbolic toolbox.
As you can see, the numerator of sol.x is a linear function of theta and the denominator does not contain theta.
Thus the whole thing boils down to determine the zero of a linear function - I'd do it using pencil and paper considering several cases (tau < 1, tau > 1, beta < 1, beta > 1, lambda < 1, lambda > 1) and combinations of these.
I changed
eqn5 = w == q*beta*y + (1-q)*((1-tau)*(1-theta)\(1-lambda)+ beta*z);
to
eqn5 = w == q*beta*y + (1-q)*((1-tau)*(1-theta)/(1-lambda)+ beta*z);
I think it was a typo.
syms x y z v w q beta rho theta lambda b tau
eqn1 = x == q*(2*rho/(1-lambda) + beta*y) + (1-q)*((1-theta)*(1-tau)/(1-lambda)+beta*z);
eqn2 = y == q*beta*v + (1-q)*(b*(1-theta)/(1-lambda)+beta*z);
eqn3 = v == q*(2*rho/(1-lambda)+ beta*y) + (1-q)*(b*(1-theta)/(1-lambda)+beta*z);
eqn4 = z == (x + w)/2;
eqn5 = w == q*beta*y + (1-q)*((1-tau)*(1-theta)/(1-lambda)+ beta*z);
sol = solve([eqn1, eqn2, eqn3, eqn4, eqn5], [x, y, z, w, v]);
sol.x
[N,D] = numden(sol.x);
collect(N,theta)
eqn6 = (1-tau)*(1-theta)/((1-beta)*(1-lambda)) - sol.x > 0;
solution = solve(eqn6, theta)
Simple enough. I'll just work with eqn6 here.
syms tau beta lambda theta Solx
eqn6 = (1-tau)*(1-theta)/((1-beta)*(1-lambda))> Solx;
solve(eqn6,theta,'returnconditions',true)
2 Comments
Dyuman Joshi
on 13 Oct 2023
Edited: Dyuman Joshi
on 13 Oct 2023
Also, as every other division operator used is a backslash or rdivide, ./, there seems to be a typo here -
% v
qn5 = w == q*beta*y + (1-q)*((1-tau)*(1-theta)\(1-lambda)+ beta*z);
Torsten
on 13 Oct 2023
sol.x is a function of theta.
Turn inequalities into equalities by adding a positive (or non-negative) variable representing how much more one side is compared to the other.
syms x y z v w q beta rho theta lambda b tau
eqn1 = x == q*(2*rho/(1-lambda) + beta*y) + (1-q)*((1-theta)*(1-tau)/(1-lambda)+beta*z);
eqn2 = y == q*beta*v + (1-q)*(b*(1-theta)/(1-lambda)+beta*z);
eqn3 = v == q*(2*rho/(1-lambda)+ beta*y) + (1-q)*(b*(1-theta)/(1-lambda)+beta*z);
eqn4 = z == (x + w)/2;
eqn5 = w == q*beta*y + (1-q)*((1-tau)*(1-theta)\(1-lambda)+ beta*z);
sol = solve([eqn1, eqn2, eqn3, eqn4, eqn5], [x, y, z, w, v]);
sol.x
syms Excess positive
eqn6 = (1-tau)*(1-theta)/((1-beta)*(1-lambda)) - Excess == sol.x
solution = solve (eqn6, theta)
sympref('AbbreviateOutput', 0)
collect(simplify(solution, 'steps', 50), Excess)
6 Comments
Sam Chak
on 13 Oct 2023
Wow! I wonder how to write such super-long equations in the journal paper or thesis.
I notice that the collect() is not working inside the sqrt()
syms x Excess
collect((Excess^2 + 5*Excess + sin(x)*Excess), Excess)
collect(sqrt(Excess^2 + 5*Excess + sin(x)*Excess), Excess)
Not only sqrt(). It also doesn't work inside the sin() function.
Perhaps the collect() only works on the symbolic polynomial expression, and the user-defined symbolic polynomial function, but not on transcendental expressions or functions.
syms a b x y son f(x, y)
theChildren = a^2*x*y + a*b*x^2 + a*x*y + x^2;
coeffs_xy = collect(a^2*x*y + a*b*x^2 + a*x*y + x^2, [x y])
childrenOfSin = collect(sin(theChildren), [x y]) % doesn't work inside a function
%% Further test using tanh(x) = exp(2*x) - 1)/(exp(2*x) + 1)
f(x, y) = a^2*x*y + a*b*x^2 + a*x*y + x^2;
collect(tanh(f(x, y)), [x y])
expr = (exp(2*f(x, y)) - 1)/(exp(2*f(x, y)) + 1)
out = collect(expr, [x y])
simplify(out, 'Steps', 50)
%% Other tests
whosDaughters = collect(theChildren, x^2)
whosSons = collect(theChildren, x*y) % doesn't work as intended
whosSons = subs(collect(subs(whosDaughters, x*y, son), son), son, x*y)
groupChildren = children(whosSons)
Looks like it does not descend into function calls except possibly _power calls with integer coefficients.
But notice also the coeffs3 result of collect on ^2 factors down to (a*b+1)^2 but that does not happen when you collect on ^-2 or 1/^2
syms a b x y son f(x)
theChildren = a^2*x*y + a*b*x^2 + a*x*y + x^2;
coeffs1 = collect(theChildren, [x y])
coeffs2 = collect(f(theChildren), [x y])
coeffs3 = collect(theChildren^2, [x y])
coeffs4 = collect(1/(theChildren^2), [x y])
coeffs5 = collect(theChildren^(-2), [x y])
1/coeffs3
ans - coeffs4
simplify(ans)
Sam Chak
on 14 Oct 2023
Thanks @Walter Roberson. I guess that your tests further reinforce that the 'collect()' function only works on strictly polynomials,
, but not on rational functions, even though they are quotients of two polynomials,
.
Walter Roberson
on 14 Oct 2023
If you look at coeffs4 the denominator is collected with respect to x: it just isn't as factored as for the coeffs3 case. It did not fail to collect: it just didn't fully factor after collecting, even though fully factoring is not a documented outcome in the first place.
Categories
Find more on Linear Algebra in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!






















