Дискуссионный математический форумМатематический форум
Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 3 часа [ Летнее время ]
новый онлайн-сервис
число, сумма и дата прописью

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Функция половинного деления???
СообщениеДобавлено: 24 окт 2020, 17:43 
Не в сети
Начинающий
Аватара пользователя
Зарегистрирован:
10 апр 2020, 07:47
Сообщений: 40
Cпасибо сказано: 35
Спасибо получено:
6 раз в 6 сообщениях
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Смиренно и покорно прошу разъяснить задачу. Сама задача: "Составить программу-функцию для нахождения отрезков локализации корней любого нелинейного уравнения с выводом:
- графика функции, который входит в нелинейное уравнение;
- вертикально расположенной таблицы табуляции функции с последующей шапкой;
- списка найденных отрезков локализации".

С таблицей я еще как-нибудь разберусь, график уже построен, а вот значения я не знаю как найти. С отрезками локализации я просто ввел для первого: [-2:0.01:2], для второго [0:0.01:2]. В общем, возможно их надо было тоже искать, а это вообще не нужно.
Вот получившийся код:
Первое уравнение (функция, его описывающая):
function z = FEQ(x)
z = 3*(x.^4)+4*(x.^3)-12*(x.^2)-5;
end

Второе уравнение (функция, его описывающая)
function z = SEQ(x)
z=log(x)+(x+1).^3;
end

Функция половинного деления
function y = SOL(f,eps,a,b,i) 
f = inline('x - exp(-x)');
eps = 0.00001;
a = 0.0;
b = 1.0;
i = 0;
while abs(a - b) > eps
c = (a + b) / 2;
if ((f(c) * f(a)) < 0)
b = c; y=b;
else
a = c; y=a;
end
i = i + 1;
end
end

Выше единственная рабочая версия кода, который я откопал, но с ним значения корней не те. В методичке есть описание этого метода, но он вызывает ошибку, как только исполняется программа. Сам этот метод я не понимаю, преподаватель отказывается помогать.
Код окна команд:
k=menu('Выбор',    'Решить первое уравнение',    'Решить второе уравнение');
if(k==1)
x1=-2; x2=2; x=[x1:0.01:x2];
SOL('FEQ',x,10^5)
FEQ(ans)
y=FEQ(x);
plot(x,y,'r')
end;
if(k==2)
x1=0; x2=2; x=[x1:0.01:x2];
SOL('SEQ',x,10^5)
SEQ(ans)
y=SEQ(x);
plot(x,y,'r')
end;

Хотелось бы понять, что к чему и как решается эта задача. Как перепробовавшему многое глупому и неопытному человеку, мне остается только искать помощи здесь.

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Функция половинного деления???
СообщениеДобавлено: 24 окт 2020, 18:20 
Не в сети
Light & Truth
Зарегистрирован:
08 апр 2015, 12:21
Сообщений: 5543
Cпасибо сказано: 161
Спасибо получено:
2040 раз в 1887 сообщениях
Очков репутации: 277

Добавить очки репутацииУменьшить очки репутации
Может быть дело в том, что параметры функции SOL, которые задаются извне, затираются вот этим фрагментом внутри самой функции?
Изображение

Вернуться к началу
 Профиль  
Cпасибо сказано 
За это сообщение пользователю michel "Спасибо" сказали:
Dispaired
 Заголовок сообщения: Re: Функция половинного деления???
СообщениеДобавлено: 24 окт 2020, 20:41 
Не в сети
Начинающий
Аватара пользователя
Зарегистрирован:
10 апр 2020, 07:47
Сообщений: 40
Cпасибо сказано: 35
Спасибо получено:
6 раз в 6 сообщениях
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Так дело в том, что без обозначения переменных при исполнении программа просто выбивает ошибку, ввиду недостатка данных о переменных в цикле while. С этим фрагментом оно хоть как-то да компилируется. Вот такой пример у меня в методичке: "
function z=CutAndTry(f, а,b,eps)
while abs(а-b)>eps
c=(a+b) /2;
if feval(f,c)*feval(f,a) <0
b=c;
else
a=c;
end;
z=c;
", вторичная функция:
"z=Fun1(x)
z=x.^4-11*x^3+x+0.1;
", а сам код здесь:
"
x1=-1;
x2=1;
dx=0.1e-2;
x=x1:dx:x2;
plot(x,Fun1(x)); grid on
CutAndTry('Fun1',x1,x2,10^5)
ans=0.3942
Fun1(ans)
ans=7.4926e-006
".
Это пример был, то есть он должен компилироваться, но увы, в матлабе просто выбивает ошибку в строчке цикла, так как значения переменных не указаны, а сам цикл требует завершения "end", в строчке где вторичная функция пропущен x^2. Так что я даже не знаю, как...

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Функция половинного деления???
СообщениеДобавлено: 24 окт 2020, 21:21 
Не в сети
Light & Truth
Зарегистрирован:
08 апр 2015, 12:21
Сообщений: 5543
Cпасибо сказано: 161
Спасибо получено:
2040 раз в 1887 сообщениях
Очков репутации: 277

Добавить очки репутацииУменьшить очки репутации
Теперь понятно, почему Вы поставили в начале вызов f=inline(), вызовы функции f(x) внутри оператора цикла надо переделать, например: вместо f(c) поставьте feval(f,c).

Вернуться к началу
 Профиль  
Cпасибо сказано 
За это сообщение пользователю michel "Спасибо" сказали:
Dispaired
 Заголовок сообщения: Re: Функция половинного деления???
СообщениеДобавлено: 25 окт 2020, 08:16 
Не в сети
Начинающий
Аватара пользователя
Зарегистрирован:
10 апр 2020, 07:47
Сообщений: 40
Cпасибо сказано: 35
Спасибо получено:
6 раз в 6 сообщениях
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Код все тот же, разве что f(c) заменил на feval(f,c). Вот что выдает, если убрать задание значения переменным. https://ibb.co/zRbg1mQ, Изображение, Изображение. Не знаю где будет лучше видно, поэтому загрузил разными способами.

Вернуться к началу
 Профиль  
Cпасибо сказано 
 Заголовок сообщения: Re: Функция половинного деления???
СообщениеДобавлено: 25 окт 2020, 08:58 
Не в сети
Профи
Зарегистрирован:
02 июн 2018, 08:50
Сообщений: 487
Cпасибо сказано: 14
Спасибо получено:
83 раз в 81 сообщениях
Очков репутации: 15

Добавить очки репутацииУменьшить очки репутации
Матлаб не знаю, хотя есть Octave, эти программы очень похожи, возможно поможет разобраться с вашим вопросом. Допустим нужно решить нелинейное уравнение методом дихотомии.

Создадим функцию
function y = fun(x)
y = x*x-2;
end

создадим еще одну функцию - решатель
function y = dihotomy(eps,a,b) 
while abs(a - b) > eps
c = (a + b) / 2;
if ((fun(c) * fun(a)) < 0)
b = c; y=b;
else
a = c; y=a;
end
end
end


сохраняем их под соответствующими именами fun.m и dihotomy.m

далее вводим в командной строке

Код:
>> a = 0;
>> b = 2;
>> eps = 0.0001;
>> root=dihotomy(eps,a,b);
>> disp (root)
1.4142

или так (без точки с запятой)
Код:
>> dihotomy(eps,a,b)
ans =  1.4142
>>

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

Вернуться к началу
 Профиль  
Cпасибо сказано 
За это сообщение пользователю Emphatic18 "Спасибо" сказали:
Dispaired
 Заголовок сообщения: Re: Функция половинного деления???
СообщениеДобавлено: 25 окт 2020, 09:36 
Не в сети
Light & Truth
Зарегистрирован:
08 апр 2015, 12:21
Сообщений: 5543
Cпасибо сказано: 161
Спасибо получено:
2040 раз в 1887 сообщениях
Очков репутации: 277

Добавить очки репутацииУменьшить очки репутации
Dispaired писал(а):
Код все тот же, разве что f(c) заменил на feval(f,c). Вот что выдает, если убрать задание значения переменным. https://ibb.co/zRbg1mQ, Изображение, Изображение. Не знаю где будет лучше видно, поэтому загрузил разными способами.

Очень плохо виден скрин, но удалось разобрать (с лупой)!
У Вас вызов функции не соответствует ни числу параметров, ни его порядку: SOL('SEQ',x,epsilon), а надо было так: SOL('SEQ',a,b,epsilon)
Разумеется, что все эти параметры должны заданы перед вызовом функции SOL.

Вернуться к началу
 Профиль  
Cпасибо сказано 
За это сообщение пользователю michel "Спасибо" сказали:
Dispaired
 Заголовок сообщения: Re: Функция половинного деления???
СообщениеДобавлено: 25 окт 2020, 09:38 
Не в сети
Начинающий
Аватара пользователя
Зарегистрирован:
10 апр 2020, 07:47
Сообщений: 40
Cпасибо сказано: 35
Спасибо получено:
6 раз в 6 сообщениях
Очков репутации: 1

Добавить очки репутацииУменьшить очки репутации
Ага, с этим разобрался. Оказывается число параметров в самой программе не совпадало, меня это немного сбивало с толку из-за "х". Я х=[x1:0.01:x2] делал, а теперь понимаю, что так нельзя. Теперь бы узнать, как точки совпадения графиков вывести в отдельные переменные.
https://ibb.co/HhmrdNp
. Как это сделать, увы я не знаю.

Вернуться к началу
 Профиль  
Cпасибо сказано 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему      Страница 1 из 1 [ Сообщений: 8 ]

 Похожие темы   Автор   Ответы   Просмотры   Последнее сообщение 
Метод половинного деления

в форуме Численные методы

Dima13

1

469

08 июн 2013, 14:44

Найти нули функции методом Ньютона и половинного деления

в форуме Пределы числовых последовательностей и функций, Исследования функций

cneltyn

3

554

22 апр 2012, 18:30

Найти остаток от деления и последнюю цифру от деления

в форуме Теория чисел

shurup4ik91

5

2890

09 дек 2010, 23:20

Косинус половинного угла

в форуме Тригонометрия

III_X

12

950

30 ноя 2013, 14:48

Формула половинного угла. Откуда минус?

в форуме Тригонометрия

Flutt1

1

202

19 мар 2017, 16:46

Определенный интеграл от косинуса половинного аргумента

в форуме Интегральное исчисление

student_up

1

281

29 май 2011, 12:39

Остаки от деления. ЗНО

в форуме Алгебра

Vlad Moroshan

9

423

07 янв 2018, 19:18

Правила деления

в форуме Алгебра

Newneelch

1

276

06 июл 2013, 21:59

Доказательство деления

в форуме Алгебра

igor777

13

466

10 янв 2017, 06:09

Остаток от деления

в форуме Начала анализа и Другие разделы школьной математики

photographer

9

438

21 июн 2016, 09:40


Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Яндекс.Метрика

Copyright © 2010-2020 MathHelpPlanet.com. All rights reserved