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
Другие вопросы по тегам