Форум кафедры Техники и Электрофизики Высоких Напряжений

Онлайн-сообщество ТВНщиков
Гостям форума:

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


Текущее время: 19 окт 2018, 22:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: 22 окт 2010, 21:00 
Не в сети
Неунывающая
Аватара пользователя

Зарегистрирован: 19 окт 2009, 13:48
Сообщения: 852
Откуда: Д-3
Добрый вечер.
Задание группе Э-04-06 дано было такое: написать функцию, которая решает систему из n уравнений по методу Ньютона с численным определением производных.
Для примера сначала взяла систему из 3х уравнений.
Система уравнений задается таким образом:
f=@(x,y,z)[x^2+y+z;4*x+2*y+z^(-1)-1;9*x+3*y^3+z-3];
Начальные приближения:
x0=[1;1;1];
Вызов функции для определения корней:
xxx=main_newton(f,x0,eps);, где eps - точность.

Тогда в теле функции у меня следующее:
function x=main_newton(f,x0,eps)
e=1;
k=0;
x=x0;
while max(e)>eps % Центральная разность
x_old=x;
h=0.001*min(x_old);
f1(:,1)=(f(x(1)+h,x(2),x(3))-f(x(1)-h,x(2),x(3)))/(2*h);
f1(:,2)=(f(x(1),x(2)+h,x(3))-f(x(1),x(2)-h,x(3)))/(2*h);
f1(:,3)=(f(x(1),x(2),x(3)+h)-f(x(1),x(2),x(3)-h))/(2*h);
x=x-(f1^-1)*f(x(1),x(2),x(3));
e=abs((x-x_old)./x);
k=k+1;
end


Таким образом, для малого и заранее известного числа уравнений и переменных написание функции проблемы не составило.
При переходе от 3 неизвестных параметров к n я столкнулась с такой трудностью: f(x(1),x(2),x(3)) нельзя заменить просто на f(x), где x - вектор-строка из n элементов. Затем ко мне пришла идея использовать ячейки, но и она провалилась, ибо получается конструкция вида {[] [] ... [] []}. То есть ячейка, а в ней n массивов 1х1, что также неприемлемо для подстановки в f(x).
Эта же трудность возникает и при определении производной.
Внимание, вопросы:
- так ли я задаю исходные данные (может быть, их необходимо задавать в каком-то другом виде)?
- если исходные данные заданы верно, то каким образом можно подставить в анонимную функцию n найденных значений переменных при том, что в виде массива это сделать невозможно?
- можно ли вообще использовать ячейки для этого? Если да, то как это можно осуществить?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 22 окт 2010, 21:21 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 03 сен 2008, 17:00
Сообщения: 337
Откуда: Д-4а
Анна, в итоге должно быть примерно так (main_newton.m):

Код:
eps = 1e-6;
f = @(x) [x(1).^2 + x(2).^3 - 17; x(1) - x(2) - 1];
x0 = [1;1];
x_fsolve = fsolve(f,x0,optimset('TolX',eps))
x_newton = newton(f,x0,eps)


Реализация функции newton и есть домашнее задание.
Мне не понадобились ячейки для её реализации. Но наверняка можно придумать решение и с их использованием.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 22 окт 2010, 21:28 
Не в сети
Неунывающая
Аватара пользователя

Зарегистрирован: 19 окт 2009, 13:48
Сообщения: 852
Откуда: Д-3
Leonid писал(а):
Анна, в итоге должно быть примерно так (main_newton.m):

Код:
eps = 1e-6;
f = @(x) [x(1).^2 + x(2).^3 - 17; x(1) - x(2) - 1];
x0 = [1;1];
x_fsolve = fsolve(f,x0,optimset('TolX',eps))
x_newton = newton(f,x0,eps)


Реализация функции newton и есть домашнее задание.
Мне не понадобились ячейки для её реализации. Но наверняка можно придумать решение и с их использованием.


Спасибо за ответ )) Я счастлива )) Узрела не сразу ))


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 22 окт 2010, 22:06 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 03 сен 2008, 17:00
Сообщения: 337
Откуда: Д-4а
Помните, что вместо
Код:
x = A^(-1) * b
или
Код:
x = inv(A) * b
лучше применять
Код:
x = A \ b
потому что это быстрее.

Попробуйте выполнить этот код, меняя значение N (не ставьте значение N слишком большим; например, при N = 5000 у меня считается 19.5, 11.2 и 3,7 секунд соответственно)
Код:
clc
N = 1000;
A = rand(N);
b = rand(N,1);
tic
x1=A^-1*b;
t1=toc
tic
x2=inv(A)*b;
t2=toc
tic
x3=A\b;
t3=toc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 22 окт 2010, 22:58 
Не в сети
Неунывающая
Аватара пользователя

Зарегистрирован: 19 окт 2009, 13:48
Сообщения: 852
Откуда: Д-3
Спасибо, Леонид Леонидович ))
Я исправлю это и запомню.
Постараюсь такими записями не вводить Вас в уныние.
:waahaa:


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

Часовой пояс: UTC + 3 часа


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

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


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

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB