Неопределенная функция 'уравнение' для входных аргументов типа 'double' - PullRequest
1 голос
/ 08 апреля 2020

Напишите функциональное уравнение (M, epsilon, tol), которое устанавливает решение x = M + epsilon * sin (x)

Функция:

function x=newtonp(f, x, tol, h)

if nargin<4
   h=1e-8
end

if nargin<3
   tol=1e-8
end

while abs(f(x))>tol
   g=(f(x+h)-f(x))/h
   x=x-f(x)/g
end
end

function y=equation(M,epsilon,tol)
   y=M+epsilon*sin(x)-x
end

Код для вызова вашей функции:

Например:

newtonp(@equation(0.5,0.5,1e-5),2,1e-5,1e-8)

Тогда я получу Неопределенная функция ' Уравнение 'для входных аргументов типа' double '. , но я не знаю почему. Кто-нибудь может мне это объяснить?

РЕДАКТИРОВАТЬ:

Используя ответ FangQ, у меня есть:

function y=equation(M,epsilon,tol)
y.newtonp=@computeNewtonp
y.sin=@computeSin
end

function x=computeNewtonp(f,x,tol,h)
if nargin<4
h=1e-8
end
if nargin<3
tol=1e-8
end
fx=f(x)
while abs(fx)>tol
g=(f(x+h)-fx)/h
x=x-fx/g
abs(fx)
end
end

function z=computeSin(x,epsilon,M)
x=computeNewtonp(f,x,tol,h)
z=epsilon*sin(x)-x+M
end

Однако у меня есть: Переменная y должна иметь тип данных double. В настоящее время это тип структуры. Проверьте, где переменной присвоено значение

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

если вы пишете функцию внутри функционального блока, она называется локальной функцией

https://www.mathworks.com/help/matlab/ref/localfunctions.html

эта функция видна только первой функции, но вы можете сделать это видимым, позволив основной функции возвращать дескриптор, как в этом уроке

https://www.mathworks.com/help/matlab/matlab_prog/call-local-functions-using-function-handles.html

0 голосов
/ 09 апреля 2020

Я думаю, вам может понадобиться определить equation как функцию x, если вы хотите использовать его в newtonp:

function y=equation(x,M,epsilon,tol)
   y=M+epsilon*sin(x)-x;
end

newtonp(@(x) equation(x,0.5,0.5,1e-5),2,1e-5,1e-8) % use anonymous function

, и вы получите

ans =  0.88786
...