(Matlab)求解不同输入的方程

(Matlab)求解不同输入的方程,matlab,Matlab,我的任务是创建一个matlab程序,我正在为这个任务搜索“开关”和“如果”函数 用户将定义任意两个变量,然后matlab将求解另一个变量。通常,我会使用“如果”来解释不同的场景,但等式中变量数量的增加也会增加行数 更新了一个演示: % Mach Number after Shockwaves M2=sqrt((((gamma-1).*M1.^2)+2)./(2*gamma.*M1.^2-(gamma-1))); % Temperature Ratio TR=((2*gamma.*M1.^2-(

我的任务是创建一个matlab程序,我正在为这个任务搜索“开关”和“如果”函数

用户将定义任意两个变量,然后matlab将求解另一个变量。通常,我会使用“如果”来解释不同的场景,但等式中变量数量的增加也会增加行数

更新了一个演示:

% Mach Number after Shockwaves
M2=sqrt((((gamma-1).*M1.^2)+2)./(2*gamma.*M1.^2-(gamma-1)));

% Temperature Ratio
TR=((2*gamma.*M1.^2-(gamma-1)).*(((gamma-1).*M1.^2)+2))./(((gamma+1)^2).*M1.^2);

% Pressure Ratio
PR=(2*gamma.*M1.^2-(gamma-1))./(gamma+1);

% Density Ratio
rhoR=((gamma+1).*M1.^2)./(((gamma-1).*M1.^2)+2);

%Stagnant Pressure Ratio Before Shockwaves
P0R=(((1+0.2.*M2.^2)./(1+0.2.*M1.^2)).^(1.4/0.1)).*((2*gamma.*M1.^2-(gamma-1))./(gamma+1));

%Stagnant Pressure Ratio After Shockwaves
P1R=((1+0.2.*M2.^2).^(1.4/0.4)).*((2*gamma.*M1.^2-(gamma-1))./(gamma+1));
还有别的选择吗?另外,在我的校园里运行的matlab没有符号工具箱,所以最好避免使用它。我现在束手无策,因为我相信有一个简单的解决方案来解释这种情况

进一步更新精确公式:
该程序将能够这样做,假设用户输入“TR”和“gamma”,然后Matlab将找到“M1”。这将被进一步带入后续的方程中,我将得到“M2”,“PR”,“rhoR”,“P0R”和“P1R”。此外,我意识到,由于Matlab将从上到下读取,有什么方法可以解释这一点吗

正如我们在评论中已经写到的,如果没有符号工具箱,您尝试做的事情是非常复杂和不可行的

我已经写了一个黑客解决方案,它只解释了这个案例: 给出了3个变量中的2个{TR,gamma,M1},然后自动计算第三个变量。这3个变量可用于求解其余方程

此解决方案假定您至少有一次访问符号工具箱的权限,但在使用生成的代码时不需要它。 我们首先根据以下每种情况的符号表达式生成MATLAB函数:

  • {TR,gamma}
    给定,
    M1
    缺失
  • {TR,M1}
    给定,
    gamma
    缺失
  • {gamma,M1}
    给定,
    TR
    缺失
这将导致写入6个m文件,
sol_TR.m
cond_TR.m
,等等

syms gamma M1 TR;
assume(gamma, 'real');
assume(gamma > 0);

assume(M1, 'real');
assume(M1 > 0);

assume(TR, 'real');
assume(TR > 0);

eq = TR ==(((gamma - 1)*M1^2 + 2)*(2*gamma*M1^2 - gamma + 1))/(M1^2*(gamma + 1)^2);

vars = {gamma, M1, TR};
num_vars = size(vars,2);

for i=1:num_vars
    current_var = vars{i};
    [sol, ~, cond] = solve(eq,current_var, 'ReturnConditions', true);
    matlabFunction(sol, 'File', sprintf('sol_%s',char(current_var)),'Vars', vars, 'Optimize', false);
    matlabFunction(cond, 'File', sprintf('cond_%s',char(current_var)),'Vars', vars, 'Optimize', false);
end
然后,可以使用这些函数计算缺少的变量:

function [input_vector] = calc_third(varname_1, var_value_1, varname_2, var_value_2)

     varnames = {'gamma', 'M1', 'TR'};
     num_vars = size(varnames,2);
     var_index = 1:num_vars;
     var_name_map = containers.Map(varnames,var_index);

     input_vector = zeros(1,num_vars);
     input_vector(var_index == var_name_map(varname_1)) = var_value_1;
     input_vector(var_index == var_name_map(varname_2)) = var_value_2;

     var_index(var_index == var_name_map(varname_1)) = [];
     var_index(var_index == var_name_map(varname_2)) = [];

     sol_func = sprintf('sol_%s(input_vector(1),input_vector(2),input_vector(3))', varnames{var_index});
     cond_func = sprintf('cond_%s(input_vector(1),input_vector(2),input_vector(3))', varnames{var_index});
     result = dot(eval(sol_func), eval(cond_func));

     input_vector(var_index)= result;
end
运行示例:

>> calc_third('gamma', 0.5, 'TR', 100) 

ans =

     0.5000    0.0669  100.0000
当然,你可以在这个解决方案的基础上创建一个包含所有8个变量的符号方程组。然后,您必须生成函数,并根据给定的输入变量选择合适的函数


不过,我不推荐这条路线。试着把符号工具箱放在你需要的地方,这会帮助你避免很多头痛。 你可以这样使用它:

function [] = calc_third(varname_1, var_value_1, varname_2, var_value_2)

    gamma = sym('gamma');
    M1 = sym('M1');
    TR = sym('TR');

    eq = TR ==(((gamma - 1)*M1^2 + 2)*(2*gamma*M1^2 - gamma + 1))/(M1^2*(gamma + 1)^2);

    subs_eq = (subs(eq,[sym(varname_1), sym(varname_2)],[var_value_1,var_value_2]));

    missing_var = symvar(subs_eq)

    solve(subs_eq,missing_var)

end
样本运行:

>> calc_third('gamma', 0.5, 'TR', 100)

missing_var =

M1

ans =

(2*2^(1/2))/(3*88609^(1/2) + 893)^(1/2)

如果你加上你的代码,你只需要支持线性方程组吗?然后看一看添加了一个简单的代码来演示我的问题@m、 但是“linsolve”能让matlab在用户输入的情况下自动求解变量吗?示例方程是唯一需要涵盖的吗?如果是,则计算不取决于是否给出
x
y
,或
x
z
,或
y
z
结果=-a-b
;你应该在需要的地方提供更多的上下文信息,等等。你需要称它们为X、Y、Z吗?或者它可以被封存?我真的应该推动我的大学升级。该方法与符号工具箱有何不同?更具体地说,在我将变量
TR
M1
gamma
设置为符号后,我将如何让matlab知道如何求解其余变量,用户输入变量后。@Jethro:我已经更新了我的答案,MATLAB将如何替换已知值并解决缺少的值。谢谢!默认情况下,Matlab符号工具箱是否在方程式中而不是在值中表示答案?符号工具箱不会尽可能长时间地使用数值解。您可以使用
eval(solve(…)
将结果转换为浮点。我已经设法使用符号工具箱获得了一个matlab,但它给出了这样的错误:
警告:方程列表为空。
ans=[empty sym]