(Matlab)求解不同输入的方程
我的任务是创建一个matlab程序,我正在为这个任务搜索“开关”和“如果”函数 用户将定义任意两个变量,然后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-(
% 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
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]