2012-01-23 2 views
1

Скажем, у меня есть функцияманипулируя математические функции в MATLAB или любом другом языке

a = b/c 

и я прошу, чтобы пользователь ввел два из этих переменных, либо б и или с и и я хочу, чтобы вычислить неизвестная переменная без необходимости писать функции для каждой переменной

в этом случае я хотел бы использовать:

pseudo-code 
if input is a & b 
then c = b/a 
if input is a & c 
then b = a * c 
if input is b & c 
then a = b/c 

Я знаю, что это функция только три переменных, так что легко т o поставьте его в if-statement и voilà, но я хочу применить его к системе, содержащей множество уравнений (например, реактивный двигатель). Раньше я использовал TkSolver, и это было действительно здорово, вы выбрасываете столько уравнений, сколько хотите (реактивный двигатель был примером!), Вам нужно всего лишь указать количество известных величин, и через несколько секунд все неизвестные (даже если у меня была известная величина в одной стороне уравнения и неизвестна на другой стороне, смешанной с известными, она будет делать математику!)

Итак, есть ли способ сделать это в MatLab или, возможно, на python который я изучаю?


Edit на вопрос, спасибо за направление мне использовать Символическое набор инструментов, это здорово, у меня есть еще одна проблема:

Я не мог придумать способ, чтобы программа могла знать, какая из переменные введены. Я могу это сделать:

syms f a b c 
f = a * c - b %(I want to write a = b/c) 
c = 10; a = 5; 
X = eval(solve(f,b)) 

То, что я хочу сейчас, это способ позволить пользователю ввести два knowns (например с & а) и код будет распознавать их и решить к неизвестной переменной (например б).


Edit 2: мне удалось получить то, что я хочу, это немного долго, и там может быть еще один способ достижения того же.

clear, clc 
syms a b c 
var = [{'a'}, {'b'}, {'c'}]; 
var1n = 0; 
var2n = 0; 

while isvarname(var1n) == 0 
    var1n = input('Which variable is known: ','s'); 
    while (any(strcmpi(var1n,var) ))== 0 
     fprintf('\nThe variable entered is wrong, please enter a, b, or c') 
     var1n = input('\nWhich variable is known: ', 's'); 
    end 
end 
fprintf('\nPlease enter the value of %s', var1n) 
var1v = input(': '); 
eval([var1n '=' num2str(var1v)]); 

while isvarname(var2n) == 0 
    var2n = input('What is the second known variable: ', 's'); 
    while (any(strcmpi(var2n,var))) == 0 
     fprintf('\nThe variable entered is wrong, please enter a, b, or c') 
     var2n = input('\nWhat is the second known variable: ', 's'); 
    end 
end 
fprintf('\nPlease enter the value of %s', var2n) 
var2v = input(': '); 
eval([var2n '=' num2str(var2v)]); 


var3n = char ( var (find(strcmpi(var1n, var) == strcmpi(var2n, var))) ); 

var3v = solve(a - b/c); 
eval([var3n '=' char(var3v)]); 

ответ

1

Вы могли бы использовать это: http://www.mathworks.de/help/toolbox/symbolic/solve.html но вы должны иметь символический математический инструментарий (:

EDIT: На странице документации по solve есть предложение:

Если правая часть уравнения равна 0, укажите левую сторону как символическое выражение или строку:

Это означает, что если вы хотите решить a = b/c для значения которых не установлен, просто перепишем уравнение так, что существует нуль на правой стороне :, т.е. a - b/c = 0, чем вы можете использовать:

syms a b c 
% E.g. assign values to a and c and automatically let matlab chose the 'free' variable (in this case, it's b: 
a = input('Input var a: ') 
a = input('Input var c: ') 
solve(a - b/c) 

, который дает вам b (например, ввод a = 10 и c = 40 дает вам b = a * c = 400). Функция ввода объясняется здесь: http://www.mathworks.de/help/techdoc/ref/input.html! Надеюсь, это поможет!

+0

Большое спасибо, это сработало, но у меня возникла еще одна проблема, я не мог придумать способ сообщить программе, какая из переменных вводится. Я могу это сделать: syms f a b c f = a * c - b% (я хочу написать a = b/c) c = 10; a = 5; X = eval (solve (f, b)) Теперь я хочу, чтобы пользователь вводил два известных (например, c & a), и код распознавал их и решал неизвестную переменную (например, b) , * Посмотрите на редактирование вопроса, код там выглядит лучше. – pythonista

+0

@Abdulhaq Elhouderi: Я сразу же верну свой ответ :) – tim

+1

Спасибо, ваш совет по использованию символического набора инструментов математики мне очень помог. Мне удалось написать код, в котором пользователь ** выбирает ** две известные переменные. – pythonista

Смежные вопросы