while loop/Fixpunktsuche

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
staacke
User
Beiträge: 2
Registriert: Dienstag 24. Dezember 2013, 13:19

Hi Leute,

ich habe folgendes spezielles Problem, was ich noch nicht in anderen Threats bisher gesehen habe.
Ich möchte eine value function iteration durchführen, d.h. dass Tw = w ergibt, wobei T der Operator ist (mehr oder weniger ein Fixpunktproblem)

Ich habe bisher folgenden Code:

Code: Alles auswählen

import numpy as np 
import find_max as fm 
def vfi(nk,nos,consum,beta,P,error_tol=1e-5,max_iter=1000, verbose=1):

	vk 		= np.zeros((nk,nos))
	decis 	= np.ones((nk,nos))
	vj 		= np.zeros((nk,nos))
	tdecis  = np.ones((nk,nos))

	metric1 = 10
	metric2 = 10
	metric  = max(metric1,metric2)
	iterate = 0

	while metric > error_tol and iterate < max_iter:
		for q in range(nos):
			z = consum[:,:,q] + beta*(vj*np.transpose(P[q,:])*np.ones((1,nk)))
			# print(z)
			tv_p 	 = z.max(0)
			tdecis_p = fm.max_pos(nk,z) 

			vk[:,q] = np.ravel(np.transpose(tv_p))
			tdecis[:,q] = np.ravel(tdecis_p)
			
		Z1 = np.abs(vk-vj)
		Z2 = np.abs(tdecis-decis)
		metric1	= Z1.max()
		metric2 = Z2.max()
		metric = max(metric1,metric2)
		iterate += 1
		if verbose:
			print "Computed iterate %d with error %f" % (iterate, metric)
		vj 	  = vk
		decis = tdecis
	return vk, tdecis, z, tdecis_p, tv_p, vj, decis, metric1, metric2, P

Das Problem habe ich ab dem zweiten Iterationsschritt. Dabei wird die Matrix v0 spaltenweise von der Matrix v1 überschrieben, wobei das erst am Ende jeder Iteration geschehen soll. Innerhalb einer Iteration soll sich die Matrix v0 nicht verändern, da ich für die verschiedenen nos (number of states) das gleiche v0 benutzen möchte.

Die Funktion max_pos findet einfach in der Matrix z spaltenweise die Position des maximalen Werts, da sollte es also keine Probleme geben.
nk ist die number of grid points = 200
nos = 7
consum ist eine nk x nk x nos Matrix
beta und crit sind skalare
P ist eine nos x nos Matrix

Für eine kleine Hilfe wäre ich sehr dankbar. Bin absoluter Neuling in Python und hab bisher nur mit Matlab gearbeitet.


Danke, Frohe Weihnachten und beste Grüße,
staacke

Edit(cofi): Code in Python-Tags gesetzt.
schaeffkoch
User
Beiträge: 38
Registriert: Dienstag 21. August 2012, 10:59

hallo,

das problem ist vielleicht, dass vj und vk auf dasselbe objekt(matrrix) verweisen, und nicht zwei unabhänige matrizen sind. einfach eine tiefe kopie anlegen mit

Code: Alles auswählen

vj=vk.copy()


dann wird die matrix nicht überschrieben.

kleines beispiel zum verständnis

Code: Alles auswählen

a=np.zeros((2,2))
b=a
b[0,0]=1
print a
staacke
User
Beiträge: 2
Registriert: Dienstag 24. Dezember 2013, 13:19

Besten Danke schaeffkoch,

das löst mein Problem. :)
Antworten