Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/104: Рейтинг темы: голосов - 104, средняя оценка - 4.79
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
1

Найти корень нелинейного уравнения

30.11.2013, 16:53. Показов 20562. Ответов 13
Метки faq+ (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте . Возник вопрос по поводу функции fzerо.
Немного не понимаю , в каких случаях она работает .
Например , почему такую функцию 2*x^2+3-е^x =0 она решает , а вот такую e^x lnx-20 = 0 - не решает .
При попытки получается такое:

Matlab M
1
2
 f='exp(x)*log(x)-20';
 x=fzero(f,[3.0, 3.2])


Вылетает ошибка: The function values at the interval endpoints must differ in sign.
Пишет , что значения функции на концах интервала должны отличаться.
Что это значит ?
Получается , что нужно просто пробовать , подходит ли такая функция для решения уравнения или нет ?
Объясните , пожалуйста.
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2013, 16:53
Ответы с готовыми решениями:

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

Найти корень уравнения методом Ньютона
помогите найти корень уравнения методом Ньютона в matlab % исходные данные f(x)=(x^2)-x-2; a=0;...

Найти корень уравнения методом хорд
в чем ошибка?clear, clc f= inline('sin(x^2)-0.5'); e=0.001; x0=pi/2; x1=0; %x2=0; while...

Найти корень уравнения методом простых итераций.
Найти корень уравнения f(x)=ln(a*x)-b*x+c при заданных значениях коэффициентов. а=6.0976 b=6.872...

13
2719 / 1773 / 187
Регистрация: 05.06.2011
Сообщений: 5,132
30.11.2013, 17:04 2
Тут написано: значения функции на концах интервала должны различаться знаком". Либо на отрезке нет корня, либо их там два. Надо уточнить отрезок.
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
30.11.2013, 17:14  [ТС] 3
Если использовать функцию fsolve , то корень считает . Но не два , а один всё-таки .
0
2719 / 1773 / 187
Регистрация: 05.06.2011
Сообщений: 5,132
30.11.2013, 17:28 4
Matlabа я не знаю. Могу только предположить, что fsolve использует другой алгоритм. Не все алгоритмы требуют, чтоб функция на концах отрезка принимала значения разных знаков. Кстати, то, что какая-то функция нашла на отрезке корень, ещё не означает, что на нём нет второго.
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
03.12.2013, 12:03 5
NNN7, а что ты хочешь получить то?
Он тебе английским языком пишет, что на указанном участке [3.0, 3.2] корня нет если указать только одну начальную точку:
x=fzero(f, 3)
то получаем ближайший корень: x = 2.9250
0
1 / 1 / 0
Регистрация: 28.07.2014
Сообщений: 13
28.07.2014, 17:29 6
Здравствуйте, у меня тоже имеется вопрос на эту тему.
При попытке найти корень уравнения:
2*cos(alf)-2.92
с помощью функции fzero
Matlab M
1
2
myfun='2*cos(alf)-2.92'
alf=fzero(myfun, 1.5)
Выбрасывается ошибка, что работа функции не может быть продолжена, т.к. пользователь ввел не корректное выражение. Далее ошибка в выражении....

Error using fzero (line 289)
FZERO cannot continue because user supplied expression ==>
2*cos(alf)-2.916666666667 failed with the error below.

Error in inline expression ==> 2*cos(alf)-2.916666666667
Undefined function or variable 'alf'.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
28.07.2014, 17:48 7
Во-первых, насколько я понимаю, Матлаб не умеет распознавать аргументы в функциях кроме иксов - знающие люди объяснят поточнее. Поэтому вашу функцию лучше задавать как
Matlab M
1
myfun='2*cos(x)-2.92'
или если хотите с альфой, то
Matlab M
1
myfun = @(alf) 2*cos(alf)-2.92
А во-вторых, какой корень вы предполагаете у такой функции?
1
1 / 1 / 0
Регистрация: 28.07.2014
Сообщений: 13
28.07.2014, 18:14 8
Да, извините ошибочка вышла функция:2*cos(alf)-0.292 (не учел степень)

Добавлено через 19 минут
С x работает, а почему с alf только через @(alf). Но да ладно попробуем усложнить задачу:
myfun =

@(alf)cos(alf)+cos(asin(sin(alf)-850*sin(fi)/1200))-(1200-850*cos(fi))/1200
где fi - задаваемый угол в виде вектор столбца. Можно ли при помощи функции fzero вычислить вектор столбец alf? или это необходимо запустить в цикле m файла? Если возможно то как?
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
28.07.2014, 18:40 9
Цитата Сообщение от Юрий75 Посмотреть сообщение
Можно ли
Можно.
Цитата Сообщение от Юрий75 Посмотреть сообщение
при помощи функции fzero
Можно.
Цитата Сообщение от Юрий75 Посмотреть сообщение
Если возможно то как?
Многими способами.
0
1 / 1 / 0
Регистрация: 28.07.2014
Сообщений: 13
28.07.2014, 19:07 10
Как?
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
28.07.2014, 23:18 11
Цитата Сообщение от Юрий75 Посмотреть сообщение
Можно ли при помощи функции fzero вычислить вектор столбец alf? или это необходимо запустить в цикле m файла?
насколько я знаю, так вот просто задать вектор параметров и получить вектор при помощи только fzero не удастся, поэтому нужен цикл. (а также подумать над вектором начальных точек х0)
Однако, можно попытаться найти решение символьно и получить выражение вида alf = f(fi), в которое подставить вектор и получить вектор
сейчас опробую...
0
5242 / 3570 / 379
Регистрация: 02.04.2012
Сообщений: 6,473
Записей в блоге: 17
28.07.2014, 23:30 12
В MATLAB R2013b ничего хорошего не вышло, а вот старичек R2009a кое-что выдал
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
clear, clc
 
syms alf fi
 
F = cos(alf)+cos(asin(sin(alf)-850*sin(fi)/1200))-(1200-850*cos(fi))/1200;
 
R = solve(F,'alf')
hold on
ezplot(R(1),[0, 4*pi])
h=ezplot(R(2),[0, 4*pi]);
set(h,'color','r')
ylim([-2.5 2.5])
Найти корень нелинейного уравнения


Однако не исключено, что результат ошибочный!
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
28.07.2014, 23:43 13
Зосима, тогда уж численный фсолве и в любом релизе все будет хорошо.
0
1 / 1 / 0
Регистрация: 28.07.2014
Сообщений: 13
30.07.2014, 07:54 14
Спасибо за советы. Старичка R2009 нет возможности поставить (Windows 7 x64), только R2013 и выше.
Пробывал fsolve, но насколько я понимаю у этой функции алгоритм несколько иной и рассчитан на задачи с ограничениями. Короче при решении поставленной задачи выбрасывается сообщение:
Warning: Trust-region-dogleg algorithm of FSOLVE cannot handle non-square systems; using Levenberg-Marquardt algorithm instead.
Далее решение продолжается (скорее всего по методу Левенберга-Марквардта), но результатом является не вектор а скаляр.
Пришлось воспользоваться цикломможет быть не совсем эффективным ну не программист я)
Matlab M
1
2
3
4
5
for i=1 :1: 901
 myfun=@(alf)cos(alf)+cos(asin(sin(alf)-850*sin(fi(i))/1200))-(1200-850*cos(fi(i)))/1200;
 alf=fzero(myfun,1.0);
 A(i)=alf;
end
где fi заранее созданный вектор, i взял по размерности вектора fi
Получил что хотел.
Результат полученный Зосима верно красная линия.(синяя инверсно)
0
30.07.2014, 07:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2014, 07:54
Помогаю со студенческими работами здесь

Решение нелинейного уравнения
k - параметр. Имеется следующее: syms k x; F = k*x^7 + k^2*x^4 + (k-2)*x^3 + (k^3-14); Как...

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

Решение нелинейного уравнения MatLab
Добрый вечер! Задача такая: "найти корень уравнения f(x)=ln(6.0976*x)-6.872*x+1" Если строить...

ОДУ и решение нелинейного уравнения
Кому не сложно, помогите решить 2 задачи по MATLAB. 1) Решить ОДУ dy/dx=x-0.1y на интервале для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru