Matlab - выбор чисел для уравнения
Я пытаюсь выбрать номера, чтобы решить уравнение. Вот мой код:
clc;
clear;
y0_star = 1;
p1 = 1;
p2 = 1;
p3 = 1;
y01_2 = 0;
y02_2 = 0;
y03_2 = 0;
iter_cnt = 0;
while (y0_star > 0.5) && (p1 + p2 + p3 ~= 1)
y0_star = 1 - 1 / (p1/(1 - y01_2) + p2/(1 - y02_2) + p3/(1 - y03_2));
if (y0_star < 0.5) && (p1 + p2 + p3 == 1)
disp('no errors')
break
else
p1 = rand;
p2 = rand;
p3 = rand;
y01_2 = rand;
y02_2 = rand;
y03_2 = rand;
end
iter_cnt = iter_cnt + 1;
if iter_cnt > 10^6
disp('error')
break
end
end
Этот код не работает должным образом. Значения p1, p2, p3, y0_star, y02_2, y03_2 должны находиться в диапазоне [0, 1]. И p1 + p2 + p3 должно равняться 1. Также я хочу, чтобы y0_star < 0.5. Как я могу это сделать? Это не значит, что каждое выбранное число должно быть случайным. Я также попытался найти некоторую информацию о решении линейных уравнений в Matlab. Но я нашел информацию только для систем уравнений.
1 ответ
Основная причина, почему это не работает, состоит в том, что вы не гарантируете, что p1 + p2 + p3 = 1
, Что вы должны сделать, это когда вы найдете p1
, p2
а также p3
, вы должны разделить каждую из этих констант на сумму всех этих чисел. Это обеспечит p1 + p2 + p3 = 1
, При этом вы можете отменить проверки, чтобы увидеть, что значения равны 1. Таким образом, это ваш модифицированный код, в котором я указал, где вам нужно изменить:
clc;
clear;
y0_star = 1;
p1 = 1;
p2 = 1;
p3 = 1;
y01_2 = 0;
y02_2 = 0;
y03_2 = 0;
iter_cnt = 0;
while (y0_star > 0.5) %// Change - no need to check for sum not equaling to 1
y0_star = 1 - 1 / (p1/(1 - y01_2) + p2/(1 - y02_2) + p3/(1 - y03_2));
if (y0_star < 0.5) %// Change - no need to check if sum equals 1 since we're normalizing
disp('no errors')
break
else
p1 = rand;
p2 = rand;
p3 = rand;
s = p1 + p2 + p3; %// Change - Find sum of p1 + p2 + p3
p1 = p1 / s; %// Change - Divide by sum to ensure sum is 1
p2 = p2 / s;
p3 = p3 / s;
y01_2 = rand;
y02_2 = rand;
y03_2 = rand;
end
iter_cnt = iter_cnt + 1;
if iter_cnt > 10^6
disp('error')
break
end
end
Запустив приведенный выше код, вот что я получаю для всех переменных:
p1 =
0.3114
p2 =
0.3476
p3 =
0.3409
y01_2 =
0.3922
y02_2 =
0.6555
y03_2 =
0.1712
y0_star =
0.4826
iter_cnt =
3
Обратите внимание, что вы получите разные результаты, так как эти числа генерируются случайным образом.
Редактировать в соответствии с вашими комментариями
Вы хотите изменить код так, чтобы p1 > p2 > p3
, Просто поместите if
заявление внутри вашего else
заявление, которое проверяет этот факт, когда вы генерируете p1,p2,p3
, Если нет, то сбросьте все параметры до значений по умолчанию, затем повторите попытку.
Другими словами:
clc;
clear;
y0_star = 1;
p1 = 1;
p2 = 1;
p3 = 1;
y01_2 = 0;
y02_2 = 0;
y03_2 = 0;
iter_cnt = 0;
while (y0_star > 0.5) %// Change - no need to check for sum not equaling to 1
y0_star = 1 - 1 / (p1/(1 - y01_2) + p2/(1 - y02_2) + p3/(1 - y03_2));
if (y0_star < 0.5) %// Change - no need to check if sum equals 1 since we're normalizing
disp('no errors')
break
else
p1 = rand;
p2 = rand;
p3 = rand;
%// Change - as per your comment
if (~( (p1 > p2) && (p2 > p3)))
y0_star = 1;
p1 = 1;
p2 = 1;
p3 = 1;
y01_2 = 0;
y02_2 = 0;
y03_2 = 0;
continue;
end
s = p1 + p2 + p3; %// Change - Find sum of p1 + p2 + p3
p1 = p1 / s; %// Change - Divide by sum to ensure sum is 1
p2 = p2 / s;
p3 = p3 / s;
y01_2 = rand;
y02_2 = rand;
y03_2 = rand;
end
iter_cnt = iter_cnt + 1;
if iter_cnt > 10^6
disp('error')
break
end
end
Когда я делаю это, вот что я получаю:
p1 =
0.5417
p2 =
0.4470
p3 =
0.0113
y01_2 =
0.3371
y02_2 =
0.1622
y03_2 =
0.7943
y0_star =
0.2886
iter_cnt =
3