Как я могу использовать fsolve для построения решений функции?

У меня есть переменная a, равная (вес./(1360*pi)).^(1/3), где вес колеблется от 4 до 8 кг.

Затем у меня есть предположение о затраченном времени, которое составляет 14400 секунд.

Рассматриваемая функция прилагается, где бесконечность заменена на k=22. Эта функция должна быть равна 57/80

r/a можно заменить на 0,464, что означает, что умножение суммы может быть записано как 2/(0,464*pi).

альфа будет равна 0,7*10^-7

Как я могу построить график времени, необходимого для приготовления массы в часах, для веса в заданном диапазоне?

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

Каково значение t в уравнении? Какие единицы возвращает уравнение?

FragileX 19.02.2023 20:58

Извините, что не включил это. Значение t в секундах, как и результат уравнения.

hdhdicb 19.02.2023 21:03

Какое значение веса дает результат 57/80?

FragileX 19.02.2023 21:12

Каждое значение веса должно использоваться в функции и быть равным 57/80. Однако значение t должно быть конкретным значением, соответствующим весу, чтобы функция была равна 57/80, причем это значение t должно быть найдено в зависимости от веса с помощью fsolve. Дайте мне знать, если есть какие-либо другие проблемы.

hdhdicb 19.02.2023 21:27
Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
1
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вам нужно основное уравнение как функция веса и t, для которого вы хотите fsolve найти ноль. Затем для каждого веса вы можете зафиксировать его в другой функции, которую вы затем решаете для t:

alpha = 0.7e-7;
rbya = 0.464;
k = 1:22;
a = @(weight)(weight./(1360*pi)).^(1/3);
eqn = @(weight,t)2/pi/rbya*sum((-1).^(k-1)./k.*sin(k*pi*rbya).*exp(-1.*k.^2.*pi^2.*alpha.*t./(a(weight).^2)))-57/80;

weights = 4:8;
ts = zeros(size(weights));
for i = 1:numel(weights)
    sub_eqn = @(t)eqn(weights(i),t);
    ts(i)=fsolve(sub_eqn,14400);
end

plot(weights,ts/(60*60))
xlabel("Weight (kg)")
ylabel("Cooking Time (hrs)")

Если вы хотите решить сразу весь набор уравнений, то вам нужно быть осторожным с размерами массивов (как вы уже поняли, подробнее здесь). k должен быть вектором-столбцом, чтобы sum суммировался по каждому столбцу, а weights должен быть вектором-строкой, чтобы поэлементные операции повторяли k для каждого веса. Вам также нужно, чтобы ваш список начальных предположений был того же размера, что и weights, чтобы fsolve мог иметь предположение для каждого веса:

alpha = 0.7e-7;
rbya = 0.464;
k = (1:22)';

a = @(weight)(weight./(1360*pi)).^(1/3);

weights = 4:8;
eqn = @(t)2/pi/rbya*sum((-1).^(k-1)./k.*sin(k*pi*rbya).*exp(-1.*k.^2.*pi^2.*alpha.*t./(a(weights).^2)))-57/80;

ts=fsolve(eqn,repmat(14400,size(weights)));

plot(weights,ts/(60*60))
xlabel("Weight (kg)")
ylabel("Cooking Time (hrs)")

Обратите внимание, что при использовании двух методов вы получаете несколько разные ответы.

Другие вопросы по теме