Я пытаюсь найти корень уравнения 3x3 + x2-10, используя итерацию. Вот код, который у меня есть до сих пор, однако я не думаю, что правильно реализовал цикл while, поскольку в настоящее время уравнение оценивается только один раз. По сути, код должен оценить, является ли абсолютное значение xVal-cVal
меньше 0,0001, и если да, он должен распечатать значение cVal
и остановиться. В противном случае значение xVal
следует установить равным cVal
и выполнить цикл возврата, однако код этого не делает.
xVal = input('Enter a value for x:');
cVal =((10-xVal^2)/3)^(1/3);
while (abs(xVal-cVal)>0.0001)
xVal = cVal;
end
disp(cVal);
Итак, while (abs (xVal-cVal)> 0,0001) xVal = cVal; cVal = 0; конец
Нет, 0 не является правильным новым значением для cVal
. Подумайте об этом, а не просто гадайте. Это будет просто бесконечно зацикливаться и проверять значение 0. Это должно быть вычислено так же, как и в первый раз.
Не могли бы вы дать ссылку на используемый вами алгоритм / формулу?
Боюсь, у меня нет ссылки - я просто изменил уравнение 3x ^ 3 + x ^ 2-10, чтобы сделать x предметом обсуждения, так что x_ (n + 1) = ∛ ((10-x ^ 2) / 3 )
Я сомневаюсь, что это сработает, потому что один из x остается в правой части уравнения, поэтому вы действуете так, как если бы это были разные числа. Рассмотрите возможность реализации en.wikipedia.org/wiki/Newton%27s_method.
У вас есть уравнение с двумя x и вы решаете один из них? Поиск корней работает не так. Два x-es имеют одинаковое значение! Я бы порекомендовал вам начать реализацию метод деления пополам, а потом искать более сложные методы.
Я добавил ссылку на изображение блок-схемы, которую пытаюсь реализовать, если это поможет?
Чтобы реализовать эту блок-схему, вам нужно пересчитать cVal
. Но я не уверен, что это обязательно сходится. Это ваш алгоритм или вы его откуда-то взяли?
Я подтверждаю, что эта итерация с фиксированной точкой сходится, если она реализована правильно (т.е.cVal
обновляется в цикле while
.
Методология, представленная на изображении блок-схемы, не будет работать.
Попробуйте этот сценарий:
func = @(xVal)((10-xVal^2)/3)^(1/3);
x = fzero(func,StratingX)
Методология, представленная в блок-схеме, будет работать. Это простая итерация с фиксированной точкой.
Вам необходимо обновить cVal
в вашем цикле while.
xVal = input('Enter a value for x:');
cVal =((10-xVal^2)/3)^(1/3);
while (abs(xVal-cVal)>0.0001)
xVal = cVal;
cVal =((10-xVal^2)/3)^(1/3);
end
disp(cVal);
Выход:
Enter a value for x:0
1.3905
Вам необходимо оценить новый
cVal
внутри цикла после присвоения старого значенияxVal
. Если у Matlab есть do-while или do-until, это будет идеальная конструкция.