Defining variable as a function of other variable

I am trying to define t as a function of k so that when I substitute compute_obj with define_t and then differentiate the objective_with_t function wrt k, Matlab should differentiate variable t for being a function of k. I tried numerous ways to define t as a function of k. Following code shows one of the ways in which I tried to do it -
% Define symbolic variables
syms k t real
% Define the relationship between k and t
t_k = @(k) t; % t is a function of k
% Define the expressions
compute_obj = -(sqrt(1 - k) * (t_k(k)^6 * (2 * m * (3 * m + 2) + 4) - t_k(k)^5 * (m * (m * (5 * m + 6) + 11) + 12) + m^6 + 2 * t_k(k)^7 - t_k(k)^8 - t_k(k)^4 * (m * (3 * m * (m * (3 * m + 2) - 3) - 16) - 9) - 2 * m^3 * t_k(k)^2 * (3 * m^3 + 2 * m + 3) + m^2 * t_k(k)^3 * (m * (3 * m * (5 * m + 4) + 1) - 4)) + sqrt(k) * (t_k(k)^4 * (m * (9 * m * (m * (m + 4) + 5) + 28) + 9) - m^4 * (3 * m - 2) - t_k(k)^6 * (6 * m * (m + 2) + 10) + t_k(k)^5 * (4 * m^3 + 12 * m + 8) + t_k(k)^8 + m * t_k(k)^2 * (m * (m * (4 * m^3 + 3 * m + 9) + 6) - 8) + 2 * m^2 * t_k(k) * (3 * m - 2) - 2 * m * t_k(k)^3 * (m * (m * (6 * m * (m + 2) + 7) + 6) - 2))) / (18 * t_k(k)^3 * (2 * t_k(k) - (m - t_k(k))^2));
define_t = (sqrt(k) * ((m / t + 2) / 3) - sqrt(1 - k) * ((1 / 3) * (2 + (m / t) + ((2 * m + t) / ((m - t)^2 - 2 * t))))) / (sqrt(k) * (2 * m^3 - 3 * (1 + m)^2 * t + t^3) / (3 * ((m - t)^2 - 2 * t)) - sqrt(1 - k) * ((2 * m + t) / 3));
% Main loop to solve for each m
m_values = linspace(0, 1, 100);
k_solutions = zeros(size(m_values));
t_solutions = zeros(size(m_values));
for i = 1:length(m_values)
m = m_values(i);
% Define the objective function with current m and symbolic t
objective_with_t = compute_obj;
% Differentiate the objective function with respect to k
d_obj_d_k = diff(objective_with_t, k);
% Convert the symbolic derivative to a MATLAB function
d_obj_d_k_fn = matlabFunction(d_obj_d_k, 'Vars', [k, t]);
% Define a function for numerical root finding to find optimal k
opt_k_fn = @(k_val) d_obj_d_k_fn(k_val, t_k(k_val));
% Use fminbnd to find the optimal k in the range [0.5, 1]
options = optimset('Display', 'off');
k_opt = fminbnd(@(k) abs(opt_k_fn(k)), 0.5, 1, options);
% Define a function for numerical root finding to find t_opt
func = matlabFunction(t_k(k) - define_t, 'Vars', t);
% Use numerical root finding to find the fixed point of t
try
t_opt = fzero(func, 0.7); % Assuming a starting guess for t
catch
t_opt = NaN;
end
% Store solutions
k_solutions(i) = k_opt;
t_solutions(i) = t_opt;
end
% Display solutions
disp(table(m_values', k_solutions', t_solutions', 'VariableNames', {'m', 'k_opt', 't_opt'}));
% Plot results
figure;
plot(m_values, k_solutions, 'b-', 'LineWidth', 1.5);
hold on;
plot(m_values, t_solutions, 'r--', 'LineWidth', 1.5);
xlabel('m');
ylabel('Value');
legend('Optimal k', 'Optimal t');
title('Stackelberg Equilibrium Solutions');
hold off;
I keep getting error. Please someone suggest a way to define t as function of k

9 件のコメント

Torsten
Torsten 2024 年 6 月 21 日
編集済み: Torsten 2024 年 6 月 21 日
Example:
syms k t(k)
compute_obj = k+t;
diff(compute_obj,k)
ans(k) = 
I don't understand how define_t comes into play.
Sabrina Garland
Sabrina Garland 2024 年 6 月 21 日
@Torsten Thanks for your reply . There are two equations - compute_obj and define_t. I want to optimize for k after substituting define_t into compute_obj and then differentiating the obtained objective function, called as objective_with_t, wrt k. But I always get an error. Please help how can I make it work in my system
Torsten
Torsten 2024 年 6 月 21 日
So you want to solve define_t(k,t) == 0 for t, insert this expression that now only depends on k into compute_obj and differentiate compute_obj with respect to k ? This will be difficult since define_t(k,t) == 0 as a function of k will have many different solutions.
Why don't you go the way I suggested ?
Sabrina Garland
Sabrina Garland 2024 年 6 月 21 日

@Torsten define_t is an expression

   t= (((k)^(1/2))*(((m/t)+2)/3) - ((1-k)^(1/2))*((1/3)(2+ (m/t)+((2m+t)/(((m-t)^2)-2t)))))/(((k)^(1/2))*(2(m^3) -3((1+m)^2)t+t^3)/(3(((m-t)^2)-2t)) - ((1-k)^(1/2))*((2m+t)/3))

Note above t expression is a function of k. Since I can't explicitly express t as a function of k, I'll have t as a function of k in an implicit and explicit way. So, I substitute this define_t (t) into compute_obj (replacing t with this expression) and optimizing for k. I am substituting so as to undertake the effect k has on t, even though partially (had I have an explicit equation things would be much clearer I guess). Then t is optimised for an optimum k. Will going the straightforward way still be able to capture the effect I am trying to capture?

Sabrina Garland
Sabrina Garland 2024 年 6 月 21 日
Any suggestions @Torsten?
Torsten
Torsten 2024 年 6 月 21 日
編集済み: Torsten 2024 年 6 月 21 日
Before continuing with complicated analytical methods, consider the following situation:
You have two profit functions qL(k,t) and qF(k,t) for leader and follower where k is the decision variable for the leader and t is the decision variable for the follower.
Make a loop over all possible values of k in which you compute the optimum response t(k) of the follower ( i.e. the response t(k) that maximizes his profit qF(k,t(k)) ).
For each such pair (k,t(k)), compute the profit qL(k,t(k)) of the leader.
Take the combination (k*,t(k*)) = (k*,t*) as optimal that maximizes qL(k,t(k)).
The only questions remaining in your case are:
What are qL and qF ?
What is the possible range of k to loop over ?
What is the possible range of t to possibly restrict the action of the follower ?
Sabrina Garland
Sabrina Garland 2024 年 6 月 21 日
Okay! Thanks for suggestion @Torsten. Let me try this... But one last thing... Why does t(k) operation doesn't work with substitution? Is it because the equation becomes too complex?
Torsten
Torsten 2024 年 6 月 21 日
編集済み: Torsten 2024 年 6 月 21 日
Why does t(k) operation doesn't work with substitution? Is it because the equation becomes too complex?
I already showed you how it works with the simple example I included above. But I don't understand what would be the purpose of this differentiation.
syms k t(k) m
compute_obj = -(sqrt(1 - k) * (t^6 * (2 * m * (3 * m + 2) + 4) - t^5 * (m * (m * (5 * m + 6) + 11) + 12) + m^6 + 2 * t^7 - t^8 - t^4 * (m * (3 * m * (m * (3 * m + 2) - 3) - 16) - 9) - 2 * m^3 * t^2 * (3 * m^3 + 2 * m + 3) + m^2 * t^3 * (m * (3 * m * (5 * m + 4) + 1) - 4)) + sqrt(k) * (t^4 * (m * (9 * m * (m * (m + 4) + 5) + 28) + 9) - m^4 * (3 * m - 2) - t^6 * (6 * m * (m + 2) + 10) + t^5 * (4 * m^3 + 12 * m + 8) + t^8 + m * t^2 * (m * (m * (4 * m^3 + 3 * m + 9) + 6) - 8) + 2 * m^2 * t * (3 * m - 2) - 2 * m * t^3 * (m * (m * (6 * m * (m + 2) + 7) + 6) - 2))) / (18 * t^3 * (2 * t - (m - t)^2));
d_obj_d_k = diff(compute_obj, k)
d_obj_d_k(k) = 
Sabrina Garland
Sabrina Garland 2024 年 6 月 21 日
Okay! Thanks @Torsten

サインインしてコメントする。

回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeFunction Creation についてさらに検索

製品

リリース

R2024a

質問済み:

2024 年 6 月 21 日

コメント済み:

2024 年 6 月 21 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by