f<-function(s){log(s^2*sin(s) + cos(s))}
curve(f,0,2.5)

# Para resolver sistemas lineares

gradconj<-function(A,b,m){      # Início do método
B=t(A)%*%A; bb=t(A)%*%b           # Adaptando o sistema para A*Au=A*v, ou Bu=b, em que B=A*A é positiva definida e b=A*v.
u=0*b
w=B%*%u-bb                        # w0
v=w                              # d1
alpha= t(w)%*%w /(t(B%*%w) %*%w); alpha=alpha[1]     # Escolha de h0
u=u-alpha*w                       # u1

for ( j in 1:m){
w=(B%*%u-bb)
beta=t(B%*%w) %*%v/(t(B%*%v) %*%v); beta=beta[1]
v=w-beta*v                   # Método de Euler
alpha= t(v) %*%w/(t(B%*%v) %*%v);alpha=alpha[1]
u=u-alpha*v                      # Método quase Euler (integral)
}
return(u)
}

#-------Interpolação de f(s) no intervalo [0,1]
print("Intervalo [0,1]")

x=seq(0,1,by=0.1);x
y=f(x);y

# Supomos y=f(x) e que f(x_i)=p(x_i), em que p(s)=a_0+a_1s+a_2s^2+a_3s^3+a_4s^4 é um polinômio.

# Podemos resolver esse problema resolvendo o sistema linear 
# Au=y
# em que a matriz A tem coluna i dada pelo vetor (1,x_i,x_i^2,...,x_i^(n-1)).

n=length(x)
A1=matrix(0,n,n)

for ( i in 1:n){
for (j in 1:n){
A1[i,j]=x[i]^(j-1)
}
}

A1

print(" Aproximação para u");u1=gradconj(A1,y,50);u1

print("Erro em Au-y"); A1%*%u1-y
#---------------------------------------------------------------------------------------

                         

poli1<-function(s){
u=u1
n=length(u)
q=u[1]
for (i in 2:n){q=q+u[i]*s^(i-1)}
q
}

curve(poli1,min(x),max(x))                           # Teste de ajuste
points(x,y,col="red")

Erro1<-function(s){f(s)-poli1(s)}
#curve(Erro1,min(x),max(x))


Intpoli1<-function(s){
u=u1
n=length(u)
q=u[1]*s
for (i in 2:n){q=q+u[i]*s^i/i}
q
}

#plot(Intpoli1,min(x),max(x))

#-------Interpolação de f(s) no intervalo [1,2]

print("Intervalo [1,2]")

x=seq(1,2,by=0.1);x; 
y=f(x);y

 # Supomos y=f(x) e que f(x_i)=p(x_i), em que p(s)=a_0+a_1s+a_2s^2+a_3s^3+a_4s^4 é um polinômio.

# Podemos resolver esse problema resolvendo o sistema linear 
# Au=y
# em que a matriz A tem coluna i dada pelo vetor (1,x_i,x_i^2,...,x_i^(n-1)).

n=length(x)
A2=matrix(0,n,n)

for ( i in 1:n){
for (j in 1:n){
A2[i,j]=x[i]^(j-1)
}
}

A2

print(" Aproximação para u");u2=gradconj(A2,y,50);u2

print("Erro em Au-y"); A2%*%u2-y
#---------------------------------------------------------------------------------------
                   
poli2<-function(s){
u=u2
n=length(u)
q=u[1]
for (i in 2:n){q=q+u[i]*s^(i-1)}
q
}

curve(poli2,min(x),max(x))                           # Teste de ajuste
points(x,y,col="red")

Erro2<-function(s){f(s)-poli2(s)}
#curve(Erro2,min(x),max(x))


Intpoli2<-function(s){
u=u2
n=length(u)
q=u[1]*s
for (i in 2:n){q=q+u[i]*s^i/i}
q
}

#plot(Intpoli2,min(x),max(x))



#-------Interpolação de f(s) no intervalo [2,2.5]-------------------------------------------

print("Intervalo [2,2.5]")

x=seq(2,2.5,by=0.05);x
y=f(x);y

 # Supomos y=f(x) e que f(x_i)=p(x_i), em que p(s)=a_0+a_1s+a_2s^2+a_3s^3+a_4s^4 é um polinômio.

# Podemos resolver esse problema resolvendo o sistema linear 
# Au=y
# em que a matriz A tem coluna i dada pelo vetor (1,x_i,x_i^2,...,x_i^(n-1)).

n=length(x)
A3=matrix(0,n,n)

for ( i in 1:n){
for (j in 1:n){
A3[i,j]=x[i]^(j-1)
}
}

A3

print(" Aproximação para u");u3=gradconj(A3,y,50);u3

print("Erro em Au-y"); A3%*%u3-y
#---------------------------------------------------------------------------------------
                   
poli3<-function(s){
u=u3
n=length(u)
q=u[1]
for (i in 2:n){q=q+u[i]*s^(i-1)}
q
}

curve(poli3,min(x),max(x))                           # Teste de ajuste
points(x,y,col="red")

Erro3<-function(s){f(s)-poli3(s)}
#curve(Erro3,min(x),max(x))


Intpoli3<-function(s){
u=u3
n=length(u)
q=u[1]*s
for (i in 2:n){q=q+u[i]*s^i/i}
q
}

#plot(Intpoli3,min(x),max(x))

#-------------------------------------------------------
#-------------Aproximação polinomial por partes
fap<-function(s){
p=poli1(s)
if ( s>1){p=poli2(s)}
if (s>2){ p=poli3(s)}
p
}

fap(0.2)
f(0.2)

fap(1.2)
f(1.2)

fap(2.2)
f(2.2)

#-----# Teste de ajuste polinomial por partes
x=seq(0,2.5,by=0.1)
y=f(x)
xx=seq(0,2.5,by=0.01)
Y=0*xx
for ( i in 1:length(Y)){Y[i]=fap(xx[i])}
plot(xx,Y,"l")             
points(x,y,col="red")


#---Integral da aproximação polinomial, por partes, no intervalo [0,2.5].
# Definição aproxomada para g(s).
Inapf<-function(s){
if (s<=1){p=Intpoli1(s)}
if (s>1){
if (s<=2){p=Intpoli1(1)+Intpoli2(s)-Intpoli2(1)}
else {p=Intpoli1(1)+Intpoli2(2)-Intpoli2(1)+Intpoli3(s)-Intpoli3(2)}
}
p
}

Inapf(2.5)


# Teste da estimativa da integral, para estimar o t da equação g(t)=1

xx=seq(0,2.5,by=0.01)
Y=0*xx
for ( i in 1:length(Y)){Y[i]=Inapf(xx[i])}
#plot(xx,Y,"l")                          

#-------Resolvendo equação g(s)=1, g(t)=int_0^tf(s)ds usando a aproximação polinomial.
# Defina G(s)=|g(s)-1|^2/2 a ser minimizada. 
# Isso nos dá grad G(s)=(g(s)-1)f(s)
G<-function(s){(Inapf(s)-1)^2/2}

xx=seq(0,2.5,by=0.01)
g=0*xx
for ( i in 1:length(Y)){g[i]=G(xx[i])}
plot(xx,g,"l") 

GradG<-function(s){(Inapf(s)-1)*f(s)}

# Método de Euler para resolver a equação u'(t)=-GradG(u(t)), u(0)=2.

u=2 # condição incial
h=0.1
it=100
for (i in 1:it){
u=u-h*GradG(u)
}

print("Solução da equação  g(s)=1, g(t)=int_0^tf(s)ds");u
G(u)
GradG(u)
Inapf(u)

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: